Skip to content

Commit ae15eef

Browse files
authored
Merge pull request #2 from RappyLabyAddons/feat/uploadActivity
Improve uploading experience with an Activity
2 parents 41edce3 + 732eadb commit ae15eef

File tree

15 files changed

+300
-97
lines changed

15 files changed

+300
-97
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ labyMod {
1717
author = "RappyTV"
1818
description = "Upload your minecraft screenshots to your custom destinations."
1919
minecraftVersion = "*"
20-
version = System.getenv().getOrDefault("VERSION", "1.0.1")
20+
version = System.getenv().getOrDefault("VERSION", "1.0.2")
2121
}
2222

2323
minecraft {
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package com.rappytv.uploader.activity;
2+
3+
import com.rappytv.uploader.api.ApiRequest;
4+
import com.rappytv.uploader.api.Uploader;
5+
import com.rappytv.uploader.api.Uploaders;
6+
import net.labymod.api.Laby;
7+
import net.labymod.api.client.component.Component;
8+
import net.labymod.api.client.component.format.NamedTextColor;
9+
import net.labymod.api.client.gui.screen.Parent;
10+
import net.labymod.api.client.gui.screen.activity.AutoActivity;
11+
import net.labymod.api.client.gui.screen.activity.Link;
12+
import net.labymod.api.client.gui.screen.activity.types.SimpleActivity;
13+
import net.labymod.api.client.gui.screen.widget.Widget;
14+
import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget;
15+
import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget;
16+
import net.labymod.api.client.gui.screen.widget.widgets.layout.FlexibleContentWidget;
17+
import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget;
18+
import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget;
19+
import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget;
20+
import net.labymod.api.notification.Notification;
21+
import java.io.File;
22+
23+
@Link("upload.lss")
24+
@AutoActivity
25+
public class UploadActivity extends SimpleActivity {
26+
27+
private final File file;
28+
29+
public UploadActivity(File file) {
30+
this.file = file;
31+
}
32+
33+
@Override
34+
public void initialize(Parent parent) {
35+
super.initialize(parent);
36+
37+
FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window");
38+
HorizontalListWidget headerWidget = new HorizontalListWidget().addId("header");
39+
ComponentWidget titleWidget = ComponentWidget.i18n("uploader.activity.title").addId("title");
40+
VerticalListWidget<Widget> content = new VerticalListWidget<>().addId("content");
41+
42+
headerWidget.addEntry(titleWidget);
43+
44+
for(Uploaders uploaderId : Uploaders.values()) {
45+
Uploader uploader = uploaderId.getUploader();
46+
47+
HorizontalListWidget uploaderWidget = new HorizontalListWidget().addId("uploader");
48+
IconWidget icon = new IconWidget(uploader.getIcon()).addId("icon");
49+
ComponentWidget name = ComponentWidget.text(uploader.getName()).addId("name");
50+
ButtonWidget button = new ButtonWidget().addId("button");
51+
if(uploader.getAuth()[1].isBlank()) {
52+
button.setEnabled(false);
53+
button.updateComponent(Component.translatable("uploader.activity.noAuth", NamedTextColor.RED));
54+
} else button.updateComponent(Component.translatable("uploader.activity.button"));
55+
56+
button.setActionListener(() -> {
57+
button.setEnabled(false);
58+
button.updateComponent(Component.translatable("uploader.activity.uploading", NamedTextColor.AQUA));
59+
ApiRequest request = new ApiRequest(uploader, file);
60+
request.sendAsyncRequest().thenAccept((result) -> {
61+
if(request.isSuccessful()) {
62+
button.setEnabled(true);
63+
button.updateComponent(Component.translatable("uploader.activity.copy", NamedTextColor.GREEN));
64+
Laby.labyAPI().notificationController().push(
65+
Notification.builder()
66+
.title(Component.translatable("uploader.toast.success"))
67+
.text(Component.translatable("uploader.activity.uploaded", Component.text(uploader.getName())))
68+
.build()
69+
);
70+
button.setActionListener(() -> {
71+
Laby.labyAPI().notificationController().push(
72+
Notification.builder()
73+
.title(Component.translatable("uploader.toast.success"))
74+
.text(Component.translatable("uploader.activity.copied"))
75+
.build()
76+
);
77+
Laby.labyAPI().minecraft().chatExecutor().copyToClipboard(!request.getUploadLink().isBlank() ? request.getUploadLink() : "");
78+
});
79+
} else {
80+
button.setEnabled(true);
81+
button.updateComponent(Component.translatable("uploader.activity.error", NamedTextColor.RED));
82+
Laby.labyAPI().notificationController().push(
83+
Notification.builder()
84+
.title(Component.translatable("uploader.toast.error"))
85+
.text(Component.text(request.getError()))
86+
.build()
87+
);
88+
}
89+
}).exceptionally((e) -> {
90+
button.setEnabled(true);
91+
button.updateComponent(Component.translatable("uploader.activity.error", NamedTextColor.RED));
92+
Laby.labyAPI().notificationController().push(
93+
Notification.builder()
94+
.title(Component.translatable("uploader.toast.error"))
95+
.text(Component.text(e.getMessage()))
96+
.build()
97+
);
98+
return null;
99+
});
100+
});
101+
102+
uploaderWidget.addEntry(icon);
103+
uploaderWidget.addEntry(name);
104+
uploaderWidget.addEntry(button);
105+
content.addChild(uploaderWidget);
106+
}
107+
108+
windowWidget.addContent(headerWidget);
109+
windowWidget.addContent(content);
110+
this.document.addChild(windowWidget);
111+
}
112+
}

core/src/main/java/com/rappytv/uploader/api/ApiRequest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,27 @@ public CompletableFuture<Void> sendAsyncRequest() {
3030
.uri(new URI(uploader.getUri()))
3131
.header("Content-Type", data.getContentType())
3232
.header(uploader.getAuth()[0], uploader.getAuth()[1])
33-
.method(uploader.getMethod(), data.getBodyPublisher())
33+
.method("POST", data.getBodyPublisher())
3434
.build();
3535

3636
HttpClient client = HttpClient.newHttpClient();
3737
client
3838
.sendAsync(request, BodyHandlers.ofString())
3939
.thenAccept((response) -> {
40-
int status = uploader.getStatus(response);
41-
successful = status >= 200 && status <= 299;
40+
successful = response.statusCode() >= 200 && response.statusCode() <= 299;
4241
uploadLink = uploader.resolveUrl(response);
4342
if(!successful) error = uploader.getError(response);
4443
future.complete(null);
4544
})
4645
.exceptionally((e) -> {
4746
future.completeExceptionally(e);
47+
successful = false;
4848
error = e.getMessage();
4949
return null;
5050
});
5151
} catch (Exception e) {
5252
error = e.getMessage();
53+
successful = false;
5354
future.completeExceptionally(e);
5455
}
5556

core/src/main/java/com/rappytv/uploader/api/Uploader.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.rappytv.uploader.api;
22

33
import com.rappytv.uploader.UploaderAddon;
4+
import net.labymod.api.client.gui.icon.Icon;
5+
import net.labymod.api.client.resources.ResourceLocation;
46
import java.io.File;
57
import java.io.IOException;
68
import java.net.http.HttpResponse;
@@ -10,10 +12,13 @@
1012
public abstract class Uploader {
1113

1214
private static final Map<String, Uploader> uploaders = new HashMap<>();
15+
protected static final ResourceLocation icons = ResourceLocation.create("uploader", "themes/vanilla/textures/settings.png");
1316
protected final UploaderAddon addon;
17+
private final String name;
1418

1519
public Uploader(String name, UploaderAddon addon) {
1620
this.addon = addon;
21+
this.name = name;
1722
uploaders.put(name.toLowerCase(), this);
1823
}
1924

@@ -25,10 +30,13 @@ public static Uploader get(String id) {
2530
return uploaders.get(id.toLowerCase());
2631
}
2732

28-
public abstract String getMethod();
33+
public String getName() {
34+
return name;
35+
}
36+
37+
public abstract Icon getIcon();
2938
public abstract String getUri();
3039
public abstract String[] getAuth();
31-
public abstract int getStatus(HttpResponse<String> response);
3240
public abstract String getError(HttpResponse<String> response);
3341
public abstract String resolveUrl(HttpResponse<String> response);
3442
public MultipartData getMultipartData(File file) throws IOException {

core/src/main/java/com/rappytv/uploader/api/uploaders/EShareUploader.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44
import com.google.gson.JsonParser;
55
import com.rappytv.uploader.UploaderAddon;
66
import com.rappytv.uploader.api.Uploader;
7+
import net.labymod.api.client.gui.icon.Icon;
78
import net.labymod.api.util.I18n;
89
import java.net.http.HttpResponse;
910

1011
public class EShareUploader extends Uploader {
1112

1213
public EShareUploader(UploaderAddon addon) {
13-
super("eshare", addon);
14+
super("EShare", addon);
1415
}
1516

1617
@Override
17-
public String getMethod() {
18-
return "POST";
18+
public Icon getIcon() {
19+
return Icon.sprite32(icons, 0, 1);
1920
}
2021

2122
@Override
@@ -28,11 +29,6 @@ public String[] getAuth() {
2829
return new String[]{"api-key", addon.configuration().eshare().auth()};
2930
}
3031

31-
@Override
32-
public int getStatus(HttpResponse<String> response) {
33-
return response.statusCode();
34-
}
35-
3632
@Override
3733
public String getError(HttpResponse<String> response) {
3834
try {

core/src/main/java/com/rappytv/uploader/api/uploaders/ImgurUploader.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.rappytv.uploader.UploaderAddon;
66
import com.rappytv.uploader.api.MultipartData;
77
import com.rappytv.uploader.api.Uploader;
8+
import net.labymod.api.client.gui.icon.Icon;
89
import net.labymod.api.util.I18n;
910
import java.io.File;
1011
import java.io.IOException;
@@ -13,12 +14,12 @@
1314
public class ImgurUploader extends Uploader {
1415

1516
public ImgurUploader(UploaderAddon addon) {
16-
super("imgur", addon);
17+
super("Imgur", addon);
1718
}
1819

1920
@Override
20-
public String getMethod() {
21-
return "POST";
21+
public Icon getIcon() {
22+
return Icon.sprite32(icons, 1, 1);
2223
}
2324

2425
@Override
@@ -31,11 +32,6 @@ public String[] getAuth() {
3132
return new String[]{"Authorization", "Client-ID (this is just a placeholder)"};
3233
}
3334

34-
@Override
35-
public int getStatus(HttpResponse<String> response) {
36-
return response.statusCode();
37-
}
38-
3935
@Override
4036
public String getError(HttpResponse<String> response) {
4137
try {

core/src/main/java/com/rappytv/uploader/api/uploaders/XBackBoneUploader.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.rappytv.uploader.UploaderAddon;
66
import com.rappytv.uploader.api.MultipartData;
77
import com.rappytv.uploader.api.Uploader;
8+
import net.labymod.api.client.gui.icon.Icon;
89
import net.labymod.api.util.I18n;
910
import java.io.File;
1011
import java.io.IOException;
@@ -13,12 +14,12 @@
1314
public class XBackBoneUploader extends Uploader {
1415

1516
public XBackBoneUploader(UploaderAddon addon) {
16-
super("xbackbone", addon);
17+
super("XBackBone", addon);
1718
}
1819

1920
@Override
20-
public String getMethod() {
21-
return "POST";
21+
public Icon getIcon() {
22+
return Icon.sprite32(icons, 2, 1);
2223
}
2324

2425
@Override
@@ -31,11 +32,6 @@ public String[] getAuth() {
3132
return new String[]{"token", addon.configuration().xbackbone().auth()};
3233
}
3334

34-
@Override
35-
public int getStatus(HttpResponse<String> response) {
36-
return response.statusCode();
37-
}
38-
3935
@Override
4036
public String getError(HttpResponse<String> response) {
4137
try {

core/src/main/java/com/rappytv/uploader/api/uploaders/ZiplineUploader.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44
import com.google.gson.JsonParser;
55
import com.rappytv.uploader.UploaderAddon;
66
import com.rappytv.uploader.api.Uploader;
7+
import net.labymod.api.client.gui.icon.Icon;
78
import net.labymod.api.util.I18n;
89
import java.net.http.HttpResponse;
910

1011
public class ZiplineUploader extends Uploader {
1112

1213
public ZiplineUploader(UploaderAddon addon) {
13-
super("zipline", addon);
14+
super("Zipline", addon);
1415
}
1516

1617
@Override
17-
public String getMethod() {
18-
return "POST";
18+
public Icon getIcon() {
19+
return Icon.sprite32(icons, 3, 1);
1920
}
2021

2122
@Override
@@ -28,18 +29,6 @@ public String[] getAuth() {
2829
return new String[]{"Authorization", addon.configuration().zipline().auth()};
2930
}
3031

31-
@Override
32-
public int getStatus(HttpResponse<String> response) {
33-
try {
34-
JsonObject object = JsonParser.parseString(response.body()).getAsJsonObject();
35-
36-
return object.has("code") ? object.get("code").getAsInt() : response.statusCode();
37-
} catch (Exception e) {
38-
e.printStackTrace();
39-
return response.statusCode();
40-
}
41-
}
42-
4332
@Override
4433
public String getError(HttpResponse<String> response) {
4534
try {

0 commit comments

Comments
 (0)