From 270a52dbd106919d2596b8525f92d514c31b5942 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 8 Jun 2024 18:36:45 +0200 Subject: [PATCH 001/105] Improve tag resolving --- .../rappytv/globaltags/nametag/CustomTag.java | 28 ++----------------- .../rappytv/globaltags/util/PlayerInfo.java | 9 +++++- .../com/rappytv/globaltags/util/TagCache.java | 28 +++++++++++++++++++ .../com/rappytv/globaltags/util/Util.java | 18 ++++++++---- 4 files changed, 51 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java b/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java index e43f860..dba9882 100644 --- a/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java +++ b/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java @@ -1,14 +1,10 @@ package com.rappytv.globaltags.nametag; import com.rappytv.globaltags.GlobalTagAddon; -import com.rappytv.globaltags.api.requests.InfoGetRequest; import com.rappytv.globaltags.config.GlobalTagConfig; import com.rappytv.globaltags.util.PlayerInfo; import com.rappytv.globaltags.util.TagCache; -import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; -import net.labymod.api.client.component.Component; -import net.labymod.api.client.component.serializer.legacy.LegacyComponentSerializer; import net.labymod.api.client.entity.Entity; import net.labymod.api.client.entity.player.Player; import net.labymod.api.client.entity.player.tag.PositionType; @@ -20,8 +16,6 @@ import net.labymod.api.client.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; import java.awt.*; -import java.util.HashSet; -import java.util.Set; import java.util.UUID; @SuppressWarnings("deprecation") @@ -31,7 +25,6 @@ public class CustomTag extends NameTag { private final int black = new Color(0, 0, 0, 70).getRGB(); private final GlobalTagConfig config; private final PositionType position; - private final Set resolving = new HashSet<>(); private PlayerInfo info; public CustomTag(GlobalTagAddon addon, PositionType position) { @@ -60,19 +53,8 @@ public float getScale() { if(TagCache.has(uuid)) info = TagCache.get(uuid); else { - if(position == PositionType.ABOVE_NAME && !resolving.contains(uuid)) { - resolving.add(uuid); - InfoGetRequest request = new InfoGetRequest(uuid, Util.getSessionToken()); - request.sendAsyncRequest((response) -> { - TagCache.add(uuid, new PlayerInfo( - translateColorCodes(request.getTag()), - request.getPosition(), - request.getIcon(), - request.isAdmin() - )); - resolving.remove(uuid); - }); - } + if(position == PositionType.ABOVE_NAME) + TagCache.resolve(uuid); } if(info == null || info.getTag() == null) return null; if(!position.equals(info.getPosition())) return null; @@ -108,10 +90,4 @@ protected NameTagBackground getCustomBackground() { public boolean isVisible() { return !this.entity.isCrouching() && super.isVisible(); } - - private Component translateColorCodes(String string) { - return LegacyComponentSerializer - .legacyAmpersand() - .deserialize(string); - } } diff --git a/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java b/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java index 86873eb..fbe74eb 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java +++ b/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java @@ -6,21 +6,28 @@ import net.labymod.api.client.resources.ResourceLocation; import java.util.HashMap; import java.util.Map; +import java.util.UUID; public class PlayerInfo { + private final UUID uuid; private final Component tag; private final String position; private final String icon; private final boolean admin; - public PlayerInfo(Component tag, String position, String icon, boolean admin) { + public PlayerInfo(UUID uuid, Component tag, String position, String icon, boolean admin) { + this.uuid = uuid; this.tag = tag; this.position = position; this.icon = icon; this.admin = admin; } + public UUID getUUID() { + return uuid; + } + public Component getTag() { return tag; } diff --git a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java b/core/src/main/java/com/rappytv/globaltags/util/TagCache.java index 82ebdc7..58aef35 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/core/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -1,12 +1,17 @@ package com.rappytv.globaltags.util; +import com.rappytv.globaltags.api.requests.InfoGetRequest; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.function.Consumer; public class TagCache { private static final Map cache = new HashMap<>(); + private static final Set resolving = new HashSet<>(); public static void add(UUID uuid, PlayerInfo info) { cache.put(uuid, info); @@ -17,6 +22,29 @@ public static boolean has(UUID uuid) { public static PlayerInfo get(UUID uuid) { return cache.get(uuid); } + public static void resolve(UUID uuid) { + resolve(uuid, (info) -> {}); + } + public static void resolve(UUID uuid, Consumer consumer) { + if(has(uuid)) { + consumer.accept(get(uuid)); + return; + } + if(resolving.contains(uuid)) return; + resolving.add(uuid); + InfoGetRequest request = new InfoGetRequest(uuid, Util.getSessionToken()); + request.sendAsyncRequest((response) -> { + add(uuid, new PlayerInfo( + uuid, + Util.translateColorCodes(request.getTag()), + request.getPosition(), + request.getIcon(), + request.isAdmin() + )); + resolving.remove(uuid); + resolve(uuid, consumer); + }); + } public static boolean isEmpty() { return cache.isEmpty(); } diff --git a/core/src/main/java/com/rappytv/globaltags/util/Util.java b/core/src/main/java/com/rappytv/globaltags/util/Util.java index 9ac41e8..8cccf72 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/core/src/main/java/com/rappytv/globaltags/util/Util.java @@ -2,6 +2,7 @@ import net.labymod.api.Laby; import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.serializer.legacy.LegacyComponentSerializer; import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.TokenStorage.Purpose; import net.labymod.api.labyconnect.TokenStorage.Token; @@ -13,11 +14,18 @@ public class Util { public static void notify(String title, String text) { - Notification.Builder builder = Notification.builder() - .title(Component.text(title)) - .text(Component.text(text)) - .type(Type.SOCIAL); - Laby.labyAPI().notificationController().push(builder.build()); + Notification.builder() + .title(net.labymod.api.client.component.Component.text(title)) + .text(net.labymod.api.client.component.Component.text(text)) + .type(Type.SOCIAL) + .buildAndPush(); + } + + public static Component translateColorCodes(String string) { + if(string == null) return null; + return LegacyComponentSerializer + .legacyAmpersand() + .deserialize(string); } public static boolean clearCache(boolean notify) { From 4bf933d73cee146d4be88b7948e6cac0382697bd Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 8 Jun 2024 19:32:45 +0200 Subject: [PATCH 002/105] Extend PlayerInfo's methods --- .../com/rappytv/globaltags/util/PlayerInfo.java | 14 ++++++++++++-- .../java/com/rappytv/globaltags/util/TagCache.java | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java b/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java index fbe74eb..393ff59 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java +++ b/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java @@ -12,13 +12,15 @@ public class PlayerInfo { private final UUID uuid; private final Component tag; + private final String plainTag; private final String position; private final String icon; private final boolean admin; - public PlayerInfo(UUID uuid, Component tag, String position, String icon, boolean admin) { + public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean admin) { this.uuid = uuid; - this.tag = tag; + this.tag = Util.translateColorCodes(tag); + this.plainTag = tag; this.position = position; this.icon = icon; this.admin = admin; @@ -32,6 +34,10 @@ public Component getTag() { return tag; } + public String getPlainTag() { + return plainTag; + } + public PositionType getPosition() { if(position == null) return PositionType.ABOVE_NAME; return switch(position) { @@ -45,6 +51,10 @@ public PositionType getPosition() { // To reduce object creation. Won't be cleared until restart private final Map iconCache = new HashMap<>(); + public String getIconName() { + return icon; + } + public Icon getIcon() { if(iconCache.containsKey(this.icon.toLowerCase())) return iconCache.get(this.icon.toLowerCase()); diff --git a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java b/core/src/main/java/com/rappytv/globaltags/util/TagCache.java index 58aef35..dce92ae 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/core/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -36,7 +36,7 @@ public static void resolve(UUID uuid, Consumer consumer) { request.sendAsyncRequest((response) -> { add(uuid, new PlayerInfo( uuid, - Util.translateColorCodes(request.getTag()), + request.getTag(), request.getPosition(), request.getIcon(), request.isAdmin() From 5c4476fa21ccaac39b14216951df0c2d0252ab24 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 8 Jun 2024 23:37:28 +0200 Subject: [PATCH 003/105] Add functionality to ban players --- .../rappytv/globaltags/api/ApiHandler.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index c1a6f57..d5f1e6a 100644 --- a/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -104,4 +104,26 @@ public Map getBody() { Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); }); } + + public void banPlayer(UUID uuid, String reason) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + uuid + "/ban", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + Map body = new HashMap<>(); + body.put("reason", reason); + return body; + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); + return; + } + Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + }); + } } From 393c8e492285ee41f9d026e39520894cd7481234 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 8 Jun 2024 23:38:05 +0200 Subject: [PATCH 004/105] Add ban bullet point and activity --- .../activities/BanUUIDActivity.java | 71 +++++++++++++++++++ .../interaction/BanBulletPoint.java | 44 ++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java create mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java new file mode 100644 index 0000000..fe2aa69 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java @@ -0,0 +1,71 @@ +package com.rappytv.globaltags.activities; + +import com.rappytv.globaltags.GlobalTagAddon; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.client.gui.screen.Parent; +import net.labymod.api.client.gui.screen.ScreenInstance; +import net.labymod.api.client.gui.screen.activity.AutoActivity; +import net.labymod.api.client.gui.screen.activity.Link; +import net.labymod.api.client.gui.screen.activity.types.SimpleActivity; +import net.labymod.api.client.gui.screen.widget.Widget; +import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.FlexibleContentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; + +import java.util.UUID; + +@Link("report.lss") +@AutoActivity +public class BanUUIDActivity extends SimpleActivity { + + private final GlobalTagAddon addon; + private final UUID uuid; + private final String username; + + public BanUUIDActivity(GlobalTagAddon addon, UUID uuid, String username) { + this.addon = addon; + this.uuid = uuid; + this.username = username; + } + + @Override + public void initialize(Parent parent) { + super.initialize(parent); + FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window"); + HorizontalListWidget profileWrapper = new HorizontalListWidget().addId("header"); + IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); + ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.ban.title", this.username).addId("username"); + VerticalListWidget content = new VerticalListWidget<>().addId("content"); + ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.reason").addId("reason"); + TextFieldWidget textField = new TextFieldWidget() + .placeholder(Component.translatable("globaltags.placeholder", NamedTextColor.DARK_GRAY)) + .addId("text-field"); + ButtonWidget button = new ButtonWidget() + .updateComponent(Component.translatable("globaltags.context.ban.send", NamedTextColor.RED)) + .addId("report-button"); + button.setEnabled(false); + button.setActionListener(() -> { + Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); + addon.getApiHandler().banPlayer(uuid, textField.getText()); + }); + textField.updateListener((text) -> button.setEnabled(!text.isBlank())); + + profileWrapper.addEntry(headWidget); + profileWrapper.addEntry(titleWidget); + + content.addChild(reasonWidget); + content.addChild(textField); + content.addChild(button); + + windowWidget.addContent(profileWrapper); + windowWidget.addContent(content); + this.document.addChild(windowWidget); + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java new file mode 100644 index 0000000..946dedb --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java @@ -0,0 +1,44 @@ +package com.rappytv.globaltags.interaction; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.activities.BanUUIDActivity; +import com.rappytv.globaltags.util.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; + +public class BanBulletPoint implements BulletPoint { + + private final GlobalTagAddon addon; + + public BanBulletPoint(GlobalTagAddon addon) { + this.addon = addon; + } + + @Override + public Component getTitle() { + return Component.translatable("globaltags.context.ban.name"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + Laby.labyAPI().minecraft().executeNextTick(() -> + Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new BanUUIDActivity(addon, player.getUniqueId(), player.getName())) + ); + } + + @Override + public boolean isVisible(Player player) { + PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); + PlayerInfo banned = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && banned != null && banned.getTag() != null; + } +} From 93006430467654dee21f70c714d46e4adbe0341d Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 8 Jun 2024 23:39:11 +0200 Subject: [PATCH 005/105] Optimize translations for new ban bullet point --- .../activities/ReportUUIDActivity.java | 8 ++++---- .../interaction/ReportBulletPoint.java | 2 +- .../resources/assets/globaltags/i18n/en_us.json | 17 +++++++++++------ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java index 4e66b95..3ec0567 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java @@ -40,14 +40,14 @@ public void initialize(Parent parent) { FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window"); HorizontalListWidget profileWrapper = new HorizontalListWidget().addId("header"); IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); - ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.report.title", this.username).addId("username"); + ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.report.title", this.username).addId("username"); VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.report.reason").addId("reason"); + ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.reason").addId("reason"); TextFieldWidget textField = new TextFieldWidget() - .placeholder(Component.translatable("globaltags.report.placeholder", NamedTextColor.DARK_GRAY)) + .placeholder(Component.translatable("globaltags.placeholder", NamedTextColor.DARK_GRAY)) .addId("text-field"); ButtonWidget button = new ButtonWidget() - .updateComponent(Component.translatable("globaltags.report.send", NamedTextColor.RED)) + .updateComponent(Component.translatable("globaltags.context.report.send", NamedTextColor.RED)) .addId("report-button"); button.setEnabled(false); button.setActionListener(() -> { diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java index 8786598..7088fc9 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java @@ -20,7 +20,7 @@ public ReportBulletPoint(GlobalTagAddon addon) { @Override public Component getTitle() { - return Component.translatable("globaltags.context.report"); + return Component.translatable("globaltags.context.report.name"); } @Override diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index a079e94..1bce2ce 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -88,13 +88,18 @@ "offline": "Connection failed!" }, "context": { - "report": "Report Globaltag" - }, - "report": { - "title": "Report %s", - "send": "Send report", "reason": "Reason", - "placeholder": "Please enter a reason..." + "placeholder": "Please enter a reason...", + "report": { + "name": "Report GlobalTag", + "title": "Report %s", + "send": "Send report" + }, + "ban": { + "name": "Ban GlobalTag player", + "title": "Ban %s", + "send": "Ban" + } } } } \ No newline at end of file From c8fd76d8d900d6ae0e0f0d7acd2f05cda9558606 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:00:35 +0200 Subject: [PATCH 006/105] Bump labygradle --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 62d3fac..9be9250 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,7 @@ rootProject.name = "GlobalTags" pluginManagement { - val labyGradlePluginVersion = "0.3.48" + val labyGradlePluginVersion = "0.4.0" plugins { id("net.labymod.gradle") version (labyGradlePluginVersion) } From 76aecce7181e822c28e86e5fd2b3eecc69758ef9 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:01:23 +0200 Subject: [PATCH 007/105] Improve ApiHandler --- .../rappytv/globaltags/GlobalTagAddon.java | 6 - .../rappytv/globaltags/api/ApiHandler.java | 198 ++++++++++++++---- .../globaltags/command/GlobalTagCommand.java | 7 +- .../globaltags/config/GlobalTagConfig.java | 11 + .../config/subconfig/TagSubConfig.java | 15 +- .../com/rappytv/globaltags/util/TagCache.java | 13 +- 6 files changed, 179 insertions(+), 71 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index cde9865..3290b02 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -1,6 +1,5 @@ package com.rappytv.globaltags; -import com.rappytv.globaltags.api.ApiHandler; import com.rappytv.globaltags.command.GlobalTagCommand; import com.rappytv.globaltags.config.GlobalTagConfig; import com.rappytv.globaltags.interaction.ReportBulletPoint; @@ -23,14 +22,12 @@ public class GlobalTagAddon extends LabyAddon { public static String prefix = "§1§lGlobalTags §8» §f"; public static String version; private static GlobalTagAddon addon; - private ApiHandler apiHandler; @Override protected void preConfigurationLoad() { Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.0"), "2023-11-24")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.7"), "2024-02-27")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.9"), "2024-06-01")); - this.apiHandler = new ApiHandler(); addon = this; } @@ -68,7 +65,4 @@ protected Class configurationClass() { public static GlobalTagAddon getAddon() { return addon; } - public ApiHandler getApiHandler() { - return apiHandler; - } } diff --git a/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index d5f1e6a..ea4fdaf 100644 --- a/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -1,71 +1,150 @@ package com.rappytv.globaltags.api; -import com.rappytv.globaltags.api.requests.IconSetRequest; -import com.rappytv.globaltags.api.requests.PositionSetRequest; -import com.rappytv.globaltags.api.requests.TagSetRequest; import com.rappytv.globaltags.util.GlobalIcon; +import com.rappytv.globaltags.util.PlayerInfo; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.util.I18n; import net.labymod.api.util.io.web.request.Request.Method; -import javax.inject.Singleton; import java.util.HashMap; import java.util.Map; import java.util.UUID; +import java.util.function.Consumer; -@Singleton +@SuppressWarnings("unused") public class ApiHandler { - public void setTag(String tag) { - TagSetRequest request = new TagSetRequest( - Util.getSessionToken(), - tag - ); + public static void getVersion(Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.GET, + "/", + null + ) { + @Override + public Map getBody() { + return null; + } + }; + request.sendAsyncRequest((response) -> consumer.accept(request.responseBody.version)); + } + + public static void getInfo(Consumer consumer) { + getInfo(Laby.labyAPI().getUniqueId(), consumer); + } + + public static void getInfo(UUID uuid, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.GET, + "/players/" + uuid, + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return null; + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(null); + return; + } + consumer.accept(new PlayerInfo( + uuid, + request.responseBody.tag, + request.responseBody.position, + request.responseBody.icon, + request.responseBody.admin + )); + }); + } + + public static void setTag(String tag, Consumer consumer) { + setTag(Laby.labyAPI().getUniqueId(), tag, consumer); + } + + public static void setTag(UUID uuid, String tag, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + uuid, + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return Map.of("tag", tag); + } + }; request.sendAsyncRequest((response -> { if(!request.isSuccessful()) { - Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); + consumer.accept(new ApiResponse(false, request.getError())); return; } - Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + consumer.accept(new ApiResponse(true, request.getMessage())); Util.clearCache(false); })); } - public void setPosition(PositionType position) { - PositionSetRequest request = new PositionSetRequest( - Util.getSessionToken(), - position - ); - request.sendAsyncRequest((response -> { + public static void setPosition(PositionType position, Consumer consumer) { + setPosition(Laby.labyAPI().getUniqueId(), position, consumer); + } + + public static void setPosition(UUID uuid, PositionType position, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + uuid + "/position", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return Map.of("position", position.name().split("_")[0]); + } + }; + request.sendAsyncRequest((response) -> { if(!request.isSuccessful()) { - Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); + consumer.accept(new ApiResponse(false, request.getError())); return; } - Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + consumer.accept(new ApiResponse(false, request.getMessage())); Util.clearCache(false); - })); + }); } - public void setIcon(GlobalIcon icon) { - IconSetRequest request = new IconSetRequest( - Util.getSessionToken(), - icon - ); - request.sendAsyncRequest((response -> { + public static void setIcon(GlobalIcon icon, Consumer consumer) { + setIcon(Laby.labyAPI().getUniqueId(), icon, consumer); + } + + public static void setIcon(UUID uuid, GlobalIcon icon, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + uuid + "/icon", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return Map.of("icon", icon.name()); + } + }; + request.sendAsyncRequest((response) -> { if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); return; } - Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + consumer.accept(new ApiResponse(true, request.getMessage())); Util.clearCache(false); - })); + }); + } + + public static void resetTag(Consumer consumer) { + resetTag(Laby.labyAPI().getUniqueId(), consumer); } - public void resetTag() { + public static void resetTag(UUID uuid, Consumer consumer) { ApiRequest request = new ApiRequest( Method.DELETE, - "/players/" + Laby.labyAPI().getUniqueId(), + "/players/" + uuid, Util.getSessionToken() ) { @Override @@ -73,17 +152,17 @@ public Map getBody() { return null; } }; - request.sendAsyncRequest((response)-> { + request.sendAsyncRequest((response) -> { if(!request.isSuccessful()) { - Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); + consumer.accept(new ApiResponse(false, request.getError())); return; } - Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + consumer.accept(new ApiResponse(true, request.getMessage())); Util.clearCache(false); }); } - public void reportPlayer(UUID uuid, String reason) { + public static void reportPlayer(UUID uuid, String reason, Consumer consumer) { ApiRequest request = new ApiRequest( Method.POST, "/players/" + uuid + "/report", @@ -98,14 +177,14 @@ public Map getBody() { }; request.sendAsyncRequest((response) -> { if(!request.isSuccessful()) { - Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); + consumer.accept(new ApiResponse(false, request.getError())); return; } - Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + consumer.accept(new ApiResponse(true, request.getMessage())); }); } - public void banPlayer(UUID uuid, String reason) { + public static void banPlayer(UUID uuid, String reason, Consumer consumer) { ApiRequest request = new ApiRequest( Method.POST, "/players/" + uuid + "/ban", @@ -120,10 +199,49 @@ public Map getBody() { }; request.sendAsyncRequest((response) -> { if(!request.isSuccessful()) { - Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); + consumer.accept(new ApiResponse(false, request.getError())); return; } - Util.notify(I18n.translate("globaltags.notifications.success"), request.getMessage()); + consumer.accept(new ApiResponse(true, request.getMessage())); }); } + + public static void toggleAdmin(UUID uuid, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + uuid + "/admin", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return null; + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); + return; + } + consumer.accept(new ApiResponse(true, request.getMessage())); + }); + } + + public static class ApiResponse { + + private final boolean successful; + private final Component message; + + public ApiResponse(boolean successful, String message) { + this.successful = successful; + this.message = Component.text(message, successful ? NamedTextColor.GREEN : NamedTextColor.RED); + } + + public boolean isSuccessful() { + return successful; + } + + public Component getMessage() { + return message; + } + } } diff --git a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java index 39fd601..f86b614 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java @@ -1,7 +1,7 @@ package com.rappytv.globaltags.command; import com.rappytv.globaltags.GlobalTagAddon; -import com.rappytv.globaltags.api.requests.VersionGetRequest; +import com.rappytv.globaltags.api.ApiHandler; import com.rappytv.globaltags.command.subcommands.ClearCacheCommand; import net.labymod.api.client.chat.command.Command; import net.labymod.api.client.component.Component; @@ -22,10 +22,7 @@ public GlobalTagCommand() { @Override public boolean execute(String prefix, String[] arguments) { - VersionGetRequest request = new VersionGetRequest(); - request.sendAsyncRequest((response) -> { - String version = request.getVersion(); - + ApiHandler.getVersion((version) -> { TextComponent clearComponent = TextComponent.builder() .append(GlobalTagAddon.prefix + "§aVersion: §b" + GlobalTagAddon.version + "\n") .append(GlobalTagAddon.prefix + "§aAPI Version: " + (version != null ? "§b" + version : "§c" + I18n.translate("globaltags.messages.offline")) + "\n") diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index ba7162e..cd05a58 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -1,7 +1,10 @@ package com.rappytv.globaltags.config; +import com.rappytv.globaltags.activities.AccountCenterActivity; import com.rappytv.globaltags.config.subconfig.TagSubConfig; import net.labymod.api.addon.AddonConfig; +import net.labymod.api.client.gui.screen.activity.Activity; +import net.labymod.api.client.gui.screen.widget.widgets.activity.settings.ActivitySettingWidget.ActivitySetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; import net.labymod.api.configuration.loader.annotation.ConfigName; @@ -9,6 +12,7 @@ import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.annotation.SpriteTexture; import net.labymod.api.configuration.loader.property.ConfigProperty; +import net.labymod.api.util.MethodOrder; @ConfigName("settings") @SpriteTexture("settings") @@ -40,6 +44,13 @@ public GlobalTagConfig() { @SpriteSlot(size = 32, x = 1) private final TagSubConfig tags = new TagSubConfig(); + @SpriteSlot(size = 32, x = 1) + @MethodOrder(after = "localizedResponses") + @ActivitySetting + public Activity accountCenter() { + return new AccountCenterActivity(); + } + @Override public ConfigProperty enabled() { return enabled; diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index fb43e9d..9d2b7e3 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -1,6 +1,5 @@ package com.rappytv.globaltags.config.subconfig; -import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.api.ApiHandler; import com.rappytv.globaltags.util.GlobalIcon; import com.rappytv.globaltags.util.Util; @@ -10,27 +9,23 @@ import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget.TextFieldSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.dropdown.DropdownWidget.DropdownSetting; import net.labymod.api.configuration.loader.Config; -import net.labymod.api.configuration.loader.annotation.Exclude; import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.property.ConfigProperty; import net.labymod.api.configuration.settings.Setting; import net.labymod.api.util.I18n; import net.labymod.api.util.MethodOrder; +@Deprecated public class TagSubConfig extends Config { - @Exclude - private final ApiHandler apiHandler; - public TagSubConfig() { - apiHandler = GlobalTagAddon.getAddon().getApiHandler(); position.addChangeListener((property, oldValue, newValue) -> { if(Laby.labyAPI().isFullyInitialized()) - apiHandler.setPosition(newValue); + ApiHandler.setPosition(newValue, (info) -> {}); }); globalIcon.addChangeListener((property, oldValue, newValue) -> { if(Laby.labyAPI().isFullyInitialized()) - apiHandler.setIcon(newValue); + ApiHandler.setIcon(newValue, (info) -> {}); }); } @@ -42,7 +37,7 @@ public TagSubConfig() { @ButtonSetting @SpriteSlot(size = 32, y = 1, x = 1) public void setTag(Setting setting) { - apiHandler.setTag(tag.get()); + ApiHandler.setTag(tag.get(), (info) -> {}); tag.set(""); Util.clearCache(false); } @@ -60,7 +55,7 @@ public void setTag(Setting setting) { @ButtonSetting @SpriteSlot(size = 32, y = 1, x = 3) public void resetTag(Setting setting) { - apiHandler.resetTag(); + ApiHandler.resetTag((info) -> {}); } @MethodOrder(after = "resetTag") diff --git a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java b/core/src/main/java/com/rappytv/globaltags/util/TagCache.java index dce92ae..4d1c3b5 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/core/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -1,6 +1,6 @@ package com.rappytv.globaltags.util; -import com.rappytv.globaltags.api.requests.InfoGetRequest; +import com.rappytv.globaltags.api.ApiHandler; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -32,15 +32,8 @@ public static void resolve(UUID uuid, Consumer consumer) { } if(resolving.contains(uuid)) return; resolving.add(uuid); - InfoGetRequest request = new InfoGetRequest(uuid, Util.getSessionToken()); - request.sendAsyncRequest((response) -> { - add(uuid, new PlayerInfo( - uuid, - request.getTag(), - request.getPosition(), - request.getIcon(), - request.isAdmin() - )); + ApiHandler.getInfo(uuid, (info) -> { + add(uuid, info); resolving.remove(uuid); resolve(uuid, consumer); }); From 78e310280fb997194c836504d1ee739d3e8a7fb7 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:13:43 +0200 Subject: [PATCH 008/105] Delete old unused request implementations --- .../api/requests/IconSetRequest.java | 25 --------- .../api/requests/InfoGetRequest.java | 51 ------------------- .../api/requests/PositionSetRequest.java | 25 --------- .../api/requests/TagSetRequest.java | 24 --------- .../api/requests/VersionGetRequest.java | 33 ------------ 5 files changed, 158 deletions(-) delete mode 100644 core/src/main/java/com/rappytv/globaltags/api/requests/IconSetRequest.java delete mode 100644 core/src/main/java/com/rappytv/globaltags/api/requests/InfoGetRequest.java delete mode 100644 core/src/main/java/com/rappytv/globaltags/api/requests/PositionSetRequest.java delete mode 100644 core/src/main/java/com/rappytv/globaltags/api/requests/TagSetRequest.java delete mode 100644 core/src/main/java/com/rappytv/globaltags/api/requests/VersionGetRequest.java diff --git a/core/src/main/java/com/rappytv/globaltags/api/requests/IconSetRequest.java b/core/src/main/java/com/rappytv/globaltags/api/requests/IconSetRequest.java deleted file mode 100644 index 2024c0e..0000000 --- a/core/src/main/java/com/rappytv/globaltags/api/requests/IconSetRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.rappytv.globaltags.api.requests; - -import com.rappytv.globaltags.api.ApiRequest; -import com.rappytv.globaltags.util.GlobalIcon; -import net.labymod.api.Laby; -import net.labymod.api.util.io.web.request.Request.Method; -import java.util.HashMap; -import java.util.Map; - -public class IconSetRequest extends ApiRequest { - - private final GlobalIcon icon; - - public IconSetRequest(String key, GlobalIcon icon) { - super(Method.POST, "/players/" + Laby.labyAPI().getUniqueId() + "/icon", key); - this.icon = icon; - } - - @Override - public Map getBody() { - Map body = new HashMap<>(); - body.put("icon", icon.name()); - return body; - } -} diff --git a/core/src/main/java/com/rappytv/globaltags/api/requests/InfoGetRequest.java b/core/src/main/java/com/rappytv/globaltags/api/requests/InfoGetRequest.java deleted file mode 100644 index 3015c8b..0000000 --- a/core/src/main/java/com/rappytv/globaltags/api/requests/InfoGetRequest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.rappytv.globaltags.api.requests; - -import com.google.gson.JsonObject; -import com.rappytv.globaltags.api.ApiRequest; -import net.labymod.api.util.io.web.request.Callback; -import net.labymod.api.util.io.web.request.Request.Method; -import java.util.Map; -import java.util.UUID; - -public class InfoGetRequest extends ApiRequest { - - private String tag; - private String position; - private String icon; - private boolean admin; - - public InfoGetRequest(UUID uuid, String key) { - super(Method.GET, "/players/" + uuid, key); - } - - @Override - public void sendAsyncRequest(Callback callback) { - super.sendAsyncRequest((response) -> { - if(isSuccessful()) { - this.tag = responseBody.tag; - this.position = responseBody.position; - this.icon = responseBody.icon; - this.admin = responseBody.admin; - } - callback.accept(response); - }); - } - - @Override - public Map getBody() { - return null; - } - - public String getTag() { - return tag; - } - public String getPosition() { - return position; - } - public String getIcon() { - return icon; - } - public boolean isAdmin() { - return admin; - } -} diff --git a/core/src/main/java/com/rappytv/globaltags/api/requests/PositionSetRequest.java b/core/src/main/java/com/rappytv/globaltags/api/requests/PositionSetRequest.java deleted file mode 100644 index 1ab1ab5..0000000 --- a/core/src/main/java/com/rappytv/globaltags/api/requests/PositionSetRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.rappytv.globaltags.api.requests; - -import com.rappytv.globaltags.api.ApiRequest; -import net.labymod.api.Laby; -import net.labymod.api.client.entity.player.tag.PositionType; -import net.labymod.api.util.io.web.request.Request.Method; -import java.util.HashMap; -import java.util.Map; - -public class PositionSetRequest extends ApiRequest { - - private final PositionType position; - - public PositionSetRequest(String key, PositionType type) { - super(Method.POST, "/players/" + Laby.labyAPI().getUniqueId() + "/position", key); - this.position = type; - } - - @Override - public Map getBody() { - Map body = new HashMap<>(); - body.put("position", position.name().split("_")[0]); - return body; - } -} diff --git a/core/src/main/java/com/rappytv/globaltags/api/requests/TagSetRequest.java b/core/src/main/java/com/rappytv/globaltags/api/requests/TagSetRequest.java deleted file mode 100644 index 0051d4d..0000000 --- a/core/src/main/java/com/rappytv/globaltags/api/requests/TagSetRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.rappytv.globaltags.api.requests; - -import com.rappytv.globaltags.api.ApiRequest; -import net.labymod.api.Laby; -import net.labymod.api.util.io.web.request.Request.Method; -import java.util.HashMap; -import java.util.Map; - -public class TagSetRequest extends ApiRequest { - - private final String tag; - - public TagSetRequest(String token, String tag) { - super(Method.POST, "/players/" + Laby.labyAPI().getUniqueId(), token); - this.tag = tag; - } - - @Override - public Map getBody() { - Map body = new HashMap<>(); - body.put("tag", tag); - return body; - } -} diff --git a/core/src/main/java/com/rappytv/globaltags/api/requests/VersionGetRequest.java b/core/src/main/java/com/rappytv/globaltags/api/requests/VersionGetRequest.java deleted file mode 100644 index 5d68a96..0000000 --- a/core/src/main/java/com/rappytv/globaltags/api/requests/VersionGetRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.rappytv.globaltags.api.requests; - -import com.google.gson.JsonObject; -import com.rappytv.globaltags.api.ApiRequest; -import net.labymod.api.util.io.web.request.Callback; -import net.labymod.api.util.io.web.request.Request.Method; -import java.util.Map; - -public class VersionGetRequest extends ApiRequest { - - private String version; - - public VersionGetRequest() { - super(Method.GET, "/", null); - } - - @Override - public void sendAsyncRequest(Callback callback) { - super.sendAsyncRequest((response) -> { - if(isSuccessful()) version = responseBody.version; - callback.accept(response); - }); - } - - @Override - public Map getBody() { - return null; - } - - public String getVersion() { - return version; - } -} From e1b5d882c8621a82652b7d3f2e387e1b3501d2a8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:15:04 +0200 Subject: [PATCH 009/105] Move api and util classes into api module --- .../java/com/rappytv/globaltags/api/ApiHandler.java | 4 ++-- .../java/com/rappytv/globaltags/api/ApiRequest.java | 11 +++++------ .../java/com/rappytv/globaltags/api/ResponseBody.java | 0 .../com/rappytv/globaltags/types}/GlobalIcon.java | 2 +- .../com/rappytv/globaltags/types}/PlayerInfo.java | 3 ++- .../java/com/rappytv/globaltags/util/TagCache.java | 1 + .../main/java/com/rappytv/globaltags/util/Util.java | 0 .../java/com/rappytv/globaltags/GlobalTagAddon.java | 6 +++--- .../globaltags/activities/BanUUIDActivity.java | 8 +++----- .../globaltags/activities/ReportUUIDActivity.java | 8 +++----- .../rappytv/globaltags/command/GlobalTagCommand.java | 3 ++- .../rappytv/globaltags/config/GlobalTagConfig.java | 10 ++++------ .../globaltags/config/subconfig/TagSubConfig.java | 2 +- .../globaltags/interaction/BanBulletPoint.java | 11 ++--------- .../globaltags/interaction/ReportBulletPoint.java | 11 ++--------- .../com/rappytv/globaltags/nametag/CustomTag.java | 2 +- 16 files changed, 32 insertions(+), 50 deletions(-) rename {core => api}/src/main/java/com/rappytv/globaltags/api/ApiHandler.java (98%) rename {core => api}/src/main/java/com/rappytv/globaltags/api/ApiRequest.java (89%) rename {core => api}/src/main/java/com/rappytv/globaltags/api/ResponseBody.java (100%) rename {core/src/main/java/com/rappytv/globaltags/util => api/src/main/java/com/rappytv/globaltags/types}/GlobalIcon.java (87%) rename {core/src/main/java/com/rappytv/globaltags/util => api/src/main/java/com/rappytv/globaltags/types}/PlayerInfo.java (96%) rename {core => api}/src/main/java/com/rappytv/globaltags/util/TagCache.java (96%) rename {core => api}/src/main/java/com/rappytv/globaltags/util/Util.java (100%) diff --git a/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java similarity index 98% rename from core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java rename to api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index ea4fdaf..f3198bc 100644 --- a/core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -1,7 +1,7 @@ package com.rappytv.globaltags.api; -import com.rappytv.globaltags.util.GlobalIcon; -import com.rappytv.globaltags.util.PlayerInfo; +import com.rappytv.globaltags.types.GlobalIcon; +import com.rappytv.globaltags.types.PlayerInfo; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; diff --git a/core/src/main/java/com/rappytv/globaltags/api/ApiRequest.java b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java similarity index 89% rename from core/src/main/java/com/rappytv/globaltags/api/ApiRequest.java rename to api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java index 26cb5e3..eccda29 100644 --- a/core/src/main/java/com/rappytv/globaltags/api/ApiRequest.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java @@ -2,8 +2,6 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; -import com.rappytv.globaltags.GlobalTagAddon; -import com.rappytv.globaltags.config.GlobalTagConfig; import net.labymod.api.Laby; import net.labymod.api.util.io.web.request.Callback; import net.labymod.api.util.io.web.request.Request; @@ -13,6 +11,9 @@ public abstract class ApiRequest { + public static boolean localizedResponses; + public static String version; + private final Gson gson = new Gson(); private boolean successful; private String message; @@ -22,13 +23,11 @@ public abstract class ApiRequest { private final Method method; private final String path; private final String key; - private final boolean localized; public ApiRequest(Method method, String path, String key) { this.method = method; this.path = path; this.key = key; - this.localized = GlobalTagConfig.localizedResponses(); } public void sendAsyncRequest(Callback callback) { @@ -37,7 +36,7 @@ public void sendAsyncRequest(Callback callback) { .method(method) .addHeader("Content-Type", "application/json") .addHeader("Authorization", key != null ? key : "") - .addHeader("X-Addon-Version", GlobalTagAddon.version) + .addHeader("X-Addon-Version", version) .handleErrorStream() .async(); @@ -45,7 +44,7 @@ public void sendAsyncRequest(Callback callback) { if(body != null) request.json(body); - if(localized) + if(localizedResponses) request.addHeader("X-Minecraft-Language", Laby.labyAPI().minecraft().options().getCurrentLanguage()); request.execute((response) -> { diff --git a/core/src/main/java/com/rappytv/globaltags/api/ResponseBody.java b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java similarity index 100% rename from core/src/main/java/com/rappytv/globaltags/api/ResponseBody.java rename to api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java diff --git a/core/src/main/java/com/rappytv/globaltags/util/GlobalIcon.java b/api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java similarity index 87% rename from core/src/main/java/com/rappytv/globaltags/util/GlobalIcon.java rename to api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java index 6079609..863ed91 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/GlobalIcon.java +++ b/api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java @@ -1,4 +1,4 @@ -package com.rappytv.globaltags.util; +package com.rappytv.globaltags.types; @SuppressWarnings("unused") public enum GlobalIcon { diff --git a/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java similarity index 96% rename from core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java rename to api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 393ff59..2e9dbd3 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -1,5 +1,6 @@ -package com.rappytv.globaltags.util; +package com.rappytv.globaltags.types; +import com.rappytv.globaltags.util.Util; import net.labymod.api.client.component.Component; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.gui.icon.Icon; diff --git a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java similarity index 96% rename from core/src/main/java/com/rappytv/globaltags/util/TagCache.java rename to api/src/main/java/com/rappytv/globaltags/util/TagCache.java index 4d1c3b5..3862df8 100644 --- a/core/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -1,6 +1,7 @@ package com.rappytv.globaltags.util; import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.types.PlayerInfo; import java.util.HashMap; import java.util.HashSet; import java.util.Map; diff --git a/core/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java similarity index 100% rename from core/src/main/java/com/rappytv/globaltags/util/Util.java rename to api/src/main/java/com/rappytv/globaltags/util/Util.java diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 3290b02..58de2e3 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -1,5 +1,6 @@ package com.rappytv.globaltags; +import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.command.GlobalTagCommand; import com.rappytv.globaltags.config.GlobalTagConfig; import com.rappytv.globaltags.interaction.ReportBulletPoint; @@ -20,7 +21,6 @@ public class GlobalTagAddon extends LabyAddon { public static String prefix = "§1§lGlobalTags §8» §f"; - public static String version; private static GlobalTagAddon addon; @Override @@ -34,7 +34,7 @@ protected void preConfigurationLoad() { @Override protected void enable() { registerSettingCategory(); - version = addon.addonInfo().getVersion(); + ApiRequest.version = addon.addonInfo().getVersion(); TagRegistry tagRegistry = labyAPI().tagRegistry(); for (PositionType positionType : PositionType.values()) @@ -45,7 +45,7 @@ protected void enable() { new CustomTag(this, positionType) ); registerListener(new ServerNavigationListener()); - labyAPI().interactionMenuRegistry().register(new ReportBulletPoint(this)); + labyAPI().interactionMenuRegistry().register(new ReportBulletPoint()); registerCommand(new GlobalTagCommand()); // Clear cache every 5 minutes diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java index fe2aa69..92641f8 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java @@ -1,6 +1,6 @@ package com.rappytv.globaltags.activities; -import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; @@ -25,12 +25,10 @@ @AutoActivity public class BanUUIDActivity extends SimpleActivity { - private final GlobalTagAddon addon; private final UUID uuid; private final String username; - public BanUUIDActivity(GlobalTagAddon addon, UUID uuid, String username) { - this.addon = addon; + public BanUUIDActivity(UUID uuid, String username) { this.uuid = uuid; this.username = username; } @@ -53,7 +51,7 @@ public void initialize(Parent parent) { button.setEnabled(false); button.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - addon.getApiHandler().banPlayer(uuid, textField.getText()); + ApiHandler.banPlayer(uuid, textField.getText(), (response) -> {}); }); textField.updateListener((text) -> button.setEnabled(!text.isBlank())); diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java index 3ec0567..735462d 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java @@ -1,6 +1,6 @@ package com.rappytv.globaltags.activities; -import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; @@ -24,12 +24,10 @@ @AutoActivity public class ReportUUIDActivity extends SimpleActivity { - private final GlobalTagAddon addon; private final UUID uuid; private final String username; - public ReportUUIDActivity(GlobalTagAddon addon, UUID uuid, String username) { - this.addon = addon; + public ReportUUIDActivity(UUID uuid, String username) { this.uuid = uuid; this.username = username; } @@ -52,7 +50,7 @@ public void initialize(Parent parent) { button.setEnabled(false); button.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - addon.getApiHandler().reportPlayer(uuid, textField.getText()); + ApiHandler.reportPlayer(uuid, textField.getText(), (response) -> {}); }); textField.updateListener((text) -> button.setEnabled(!text.isBlank())); diff --git a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java index f86b614..d60e897 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java @@ -2,6 +2,7 @@ import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.command.subcommands.ClearCacheCommand; import net.labymod.api.client.chat.command.Command; import net.labymod.api.client.component.Component; @@ -24,7 +25,7 @@ public GlobalTagCommand() { public boolean execute(String prefix, String[] arguments) { ApiHandler.getVersion((version) -> { TextComponent clearComponent = TextComponent.builder() - .append(GlobalTagAddon.prefix + "§aVersion: §b" + GlobalTagAddon.version + "\n") + .append(GlobalTagAddon.prefix + "§aVersion: §b" + ApiRequest.version + "\n") .append(GlobalTagAddon.prefix + "§aAPI Version: " + (version != null ? "§b" + version : "§c" + I18n.translate("globaltags.messages.offline")) + "\n") .append(GlobalTagAddon.prefix) .append(Component diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index cd05a58..f22fad0 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -1,6 +1,7 @@ package com.rappytv.globaltags.config; import com.rappytv.globaltags.activities.AccountCenterActivity; +import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.config.subconfig.TagSubConfig; import net.labymod.api.addon.AddonConfig; import net.labymod.api.client.gui.screen.activity.Activity; @@ -18,10 +19,10 @@ @SpriteTexture("settings") public class GlobalTagConfig extends AddonConfig { - private static boolean localized; - public GlobalTagConfig() { - localizedResponses.addChangeListener((property, oldValue, newValue) -> localized = newValue); + localizedResponses.addChangeListener((property, oldValue, newValue) -> + ApiRequest.localizedResponses = newValue + ); } @SwitchSetting @@ -64,7 +65,4 @@ public ConfigProperty tagSize() { public ConfigProperty showBackground() { return showBackground; } - public static boolean localizedResponses() { - return localized; - } } diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 9d2b7e3..46c12c8 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -1,7 +1,7 @@ package com.rappytv.globaltags.config.subconfig; import com.rappytv.globaltags.api.ApiHandler; -import com.rappytv.globaltags.util.GlobalIcon; +import com.rappytv.globaltags.types.GlobalIcon; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; import net.labymod.api.client.entity.player.tag.PositionType; diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java index 946dedb..f32199c 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java @@ -1,8 +1,7 @@ package com.rappytv.globaltags.interaction; -import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.activities.BanUUIDActivity; -import com.rappytv.globaltags.util.PlayerInfo; +import com.rappytv.globaltags.types.PlayerInfo; import com.rappytv.globaltags.util.TagCache; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; @@ -12,12 +11,6 @@ public class BanBulletPoint implements BulletPoint { - private final GlobalTagAddon addon; - - public BanBulletPoint(GlobalTagAddon addon) { - this.addon = addon; - } - @Override public Component getTitle() { return Component.translatable("globaltags.context.ban.name"); @@ -31,7 +24,7 @@ public Icon getIcon() { @Override public void execute(Player player) { Laby.labyAPI().minecraft().executeNextTick(() -> - Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new BanUUIDActivity(addon, player.getUniqueId(), player.getName())) + Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new BanUUIDActivity(player.getUniqueId(), player.getName())) ); } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java index 7088fc9..dabfb39 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ReportBulletPoint.java @@ -1,8 +1,7 @@ package com.rappytv.globaltags.interaction; -import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.activities.ReportUUIDActivity; -import com.rappytv.globaltags.util.PlayerInfo; +import com.rappytv.globaltags.types.PlayerInfo; import com.rappytv.globaltags.util.TagCache; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; @@ -12,12 +11,6 @@ public class ReportBulletPoint implements BulletPoint { - private final GlobalTagAddon addon; - - public ReportBulletPoint(GlobalTagAddon addon) { - this.addon = addon; - } - @Override public Component getTitle() { return Component.translatable("globaltags.context.report.name"); @@ -31,7 +24,7 @@ public Icon getIcon() { @Override public void execute(Player player) { Laby.labyAPI().minecraft().executeNextTick(() -> - Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new ReportUUIDActivity(addon, player.getUniqueId(), player.getName())) + Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new ReportUUIDActivity(player.getUniqueId(), player.getName())) ); } diff --git a/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java b/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java index dba9882..a987cd7 100644 --- a/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java +++ b/core/src/main/java/com/rappytv/globaltags/nametag/CustomTag.java @@ -2,7 +2,7 @@ import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.config.GlobalTagConfig; -import com.rappytv.globaltags.util.PlayerInfo; +import com.rappytv.globaltags.types.PlayerInfo; import com.rappytv.globaltags.util.TagCache; import net.labymod.api.Laby; import net.labymod.api.client.entity.Entity; From 7a17c42137bf93828b8e3e8838f5ac8eae8223df Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:20:53 +0200 Subject: [PATCH 010/105] Add response messages to all Input activities --- .../activities/BanUUIDActivity.java | 7 +- .../activities/ChangeTagActivity.java | 73 +++++++++++++++++++ .../activities/ReportUUIDActivity.java | 7 +- 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java index 92641f8..3a2bb26 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java @@ -1,5 +1,6 @@ package com.rappytv.globaltags.activities; +import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.api.ApiHandler; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; @@ -51,7 +52,11 @@ public void initialize(Parent parent) { button.setEnabled(false); button.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - ApiHandler.banPlayer(uuid, textField.getText(), (response) -> {}); + ApiHandler.banPlayer(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); }); textField.updateListener((text) -> button.setEnabled(!text.isBlank())); diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java new file mode 100644 index 0000000..af6d25e --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java @@ -0,0 +1,73 @@ +package com.rappytv.globaltags.activities; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; +import java.util.UUID; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.client.gui.screen.Parent; +import net.labymod.api.client.gui.screen.ScreenInstance; +import net.labymod.api.client.gui.screen.activity.AutoActivity; +import net.labymod.api.client.gui.screen.activity.Link; +import net.labymod.api.client.gui.screen.activity.types.SimpleActivity; +import net.labymod.api.client.gui.screen.widget.Widget; +import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.FlexibleContentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; + +@Link("report.lss") +@AutoActivity +public class ChangeTagActivity extends SimpleActivity { + + private final UUID uuid; + private final String username; + + public ChangeTagActivity(UUID uuid, String username) { + this.uuid = uuid; + this.username = username; + } + + @Override + public void initialize(Parent parent) { + super.initialize(parent); + FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window"); + HorizontalListWidget profileWrapper = new HorizontalListWidget().addId("header"); + IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); + ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.changeTag.title", this.username).addId("username"); + VerticalListWidget content = new VerticalListWidget<>().addId("content"); + ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.changeTag.label").addId("reason"); + TextFieldWidget textField = new TextFieldWidget() + .placeholder(Component.translatable("globaltags.context.changeTag.placeholder", NamedTextColor.DARK_GRAY)) + .addId("text-field"); + ButtonWidget button = new ButtonWidget() + .updateComponent(Component.translatable("globaltags.context.changeTag.send", NamedTextColor.RED)) + .addId("report-button"); + button.setEnabled(false); + button.setActionListener(() -> { + Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); + ApiHandler.setTag(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); + }); + textField.updateListener((text) -> button.setEnabled(!text.isBlank())); + + profileWrapper.addEntry(headWidget); + profileWrapper.addEntry(titleWidget); + + content.addChild(labelWidget); + content.addChild(textField); + content.addChild(button); + + windowWidget.addContent(profileWrapper); + windowWidget.addContent(content); + this.document.addChild(windowWidget); + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java index 735462d..70915a9 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java @@ -1,5 +1,6 @@ package com.rappytv.globaltags.activities; +import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.api.ApiHandler; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; @@ -50,7 +51,11 @@ public void initialize(Parent parent) { button.setEnabled(false); button.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - ApiHandler.reportPlayer(uuid, textField.getText(), (response) -> {}); + ApiHandler.reportPlayer(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); }); textField.updateListener((text) -> button.setEnabled(!text.isBlank())); From da28128a69e17dd8eb850985c88b275f5c98115b Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:22:10 +0200 Subject: [PATCH 011/105] Add more bullet points, register all --- .../rappytv/globaltags/GlobalTagAddon.java | 12 ++++-- .../interaction/BanBulletPoint.java | 4 +- .../interaction/ChangeTagBulletPoint.java | 37 +++++++++++++++++ .../interaction/ClearTagBulletPoint.java | 40 +++++++++++++++++++ .../interaction/ToggleAdminBulletPoint.java | 40 +++++++++++++++++++ 5 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java create mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java create mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 58de2e3..94fbac2 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -3,7 +3,11 @@ import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.command.GlobalTagCommand; import com.rappytv.globaltags.config.GlobalTagConfig; +import com.rappytv.globaltags.interaction.BanBulletPoint; +import com.rappytv.globaltags.interaction.ChangeTagBulletPoint; +import com.rappytv.globaltags.interaction.ClearTagBulletPoint; import com.rappytv.globaltags.interaction.ReportBulletPoint; +import com.rappytv.globaltags.interaction.ToggleAdminBulletPoint; import com.rappytv.globaltags.listener.ServerNavigationListener; import com.rappytv.globaltags.nametag.CustomTag; import com.rappytv.globaltags.util.Util; @@ -45,7 +49,11 @@ protected void enable() { new CustomTag(this, positionType) ); registerListener(new ServerNavigationListener()); + labyAPI().interactionMenuRegistry().register(new BanBulletPoint()); + labyAPI().interactionMenuRegistry().register(new ChangeTagBulletPoint()); + labyAPI().interactionMenuRegistry().register(new ClearTagBulletPoint()); labyAPI().interactionMenuRegistry().register(new ReportBulletPoint()); + labyAPI().interactionMenuRegistry().register(new ToggleAdminBulletPoint()); registerCommand(new GlobalTagCommand()); // Clear cache every 5 minutes @@ -61,8 +69,4 @@ public void run() { protected Class configurationClass() { return GlobalTagConfig.class; } - - public static GlobalTagAddon getAddon() { - return addon; - } } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java index f32199c..a3c2b68 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java @@ -31,7 +31,7 @@ public void execute(Player player) { @Override public boolean isVisible(Player player) { PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); - PlayerInfo banned = TagCache.get(player.getUniqueId()); - return executer != null && executer.isAdmin() && banned != null && banned.getTag() != null; + PlayerInfo target = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && target != null && target.getTag() != null; } } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java new file mode 100644 index 0000000..14cc9ed --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java @@ -0,0 +1,37 @@ +package com.rappytv.globaltags.interaction; + +import com.rappytv.globaltags.activities.ChangeTagActivity; +import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; + +public class ChangeTagBulletPoint implements BulletPoint { + + @Override + public Component getTitle() { + return Component.translatable("globaltags.context.report"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + Laby.labyAPI().minecraft().executeNextTick(() -> + Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new ChangeTagActivity(player.getUniqueId(), player.getName())) + ); + } + + @Override + public boolean isVisible(Player player) { + PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); + PlayerInfo target = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && target != null && target.getTag() != null; + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java new file mode 100644 index 0000000..7877157 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java @@ -0,0 +1,40 @@ +package com.rappytv.globaltags.interaction; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; + +public class ClearTagBulletPoint implements BulletPoint { + + @Override + public Component getTitle() { + return Component.translatable("globaltags.context.resetTag"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + ApiHandler.resetTag(player.getUniqueId(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); + } + + @Override + public boolean isVisible(Player player) { + PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); + PlayerInfo target = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && target != null && target.getTag() != null; + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java new file mode 100644 index 0000000..79aa066 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java @@ -0,0 +1,40 @@ +package com.rappytv.globaltags.interaction; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; + +public class ToggleAdminBulletPoint implements BulletPoint { + + @Override + public Component getTitle() { + return Component.translatable("globaltags.context.toggleAdmin.name"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + ApiHandler.toggleAdmin(player.getUniqueId(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); + } + + @Override + public boolean isVisible(Player player) { + PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); + PlayerInfo target = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && target != null && target.getTag() != null; + } +} From 45a318014d910937e5aa968912fdf2cda23e2c8b Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:55:13 +0200 Subject: [PATCH 012/105] Fix translations of new bullet points --- .../interaction/ChangeTagBulletPoint.java | 2 +- .../globaltags/interaction/ClearTagBulletPoint.java | 2 +- .../resources/assets/globaltags/i18n/en_us.json | 13 +++++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java index 14cc9ed..73b3b9a 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java @@ -13,7 +13,7 @@ public class ChangeTagBulletPoint implements BulletPoint { @Override public Component getTitle() { - return Component.translatable("globaltags.context.report"); + return Component.translatable("globaltags.context.changeTag.name"); } @Override diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java index 7877157..b9c23aa 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java @@ -14,7 +14,7 @@ public class ClearTagBulletPoint implements BulletPoint { @Override public Component getTitle() { - return Component.translatable("globaltags.context.resetTag"); + return Component.translatable("globaltags.context.clearTag.name"); } @Override diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 1bce2ce..6c5430e 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -99,6 +99,19 @@ "name": "Ban GlobalTag player", "title": "Ban %s", "send": "Ban" + }, + "changeTag": { + "name": "Change GlobalTag", + "title": "Change %s's Tag", + "label": "New GlobalTag", + "placeholder": "Enter the updated GlobalTag...", + "send": "Update Tag" + }, + "clearTag": { + "name": "Clear GlobalTag" + }, + "toggleAdmin": { + "name": "Toggle GlobalTag Admin" } } } From dfd8a0a00c02e8a0660da37146e0ee59f10c2237 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 01:55:23 +0200 Subject: [PATCH 013/105] Fix translations of new bullet points --- .../activities/BanUUIDActivity.java | 4 +- .../activities/ChangeTagActivity.java | 64 ++++++++++--------- .../activities/ReportUUIDActivity.java | 4 +- 3 files changed, 38 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java index 3a2bb26..28ec0a2 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java @@ -42,9 +42,9 @@ public void initialize(Parent parent) { IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.ban.title", this.username).addId("username"); VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.reason").addId("reason"); + ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.context.reason").addId("reason"); TextFieldWidget textField = new TextFieldWidget() - .placeholder(Component.translatable("globaltags.placeholder", NamedTextColor.DARK_GRAY)) + .placeholder(Component.translatable("globaltags.context.placeholder", NamedTextColor.DARK_GRAY)) .addId("text-field"); ButtonWidget button = new ButtonWidget() .updateComponent(Component.translatable("globaltags.context.ban.send", NamedTextColor.RED)) diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java index af6d25e..af8f30f 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java @@ -3,6 +3,7 @@ import com.rappytv.globaltags.GlobalTagAddon; import com.rappytv.globaltags.api.ApiHandler; import java.util.UUID; +import com.rappytv.globaltags.util.TagCache; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; @@ -36,38 +37,41 @@ public ChangeTagActivity(UUID uuid, String username) { @Override public void initialize(Parent parent) { super.initialize(parent); - FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window"); - HorizontalListWidget profileWrapper = new HorizontalListWidget().addId("header"); - IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); - ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.changeTag.title", this.username).addId("username"); - VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.changeTag.label").addId("reason"); - TextFieldWidget textField = new TextFieldWidget() - .placeholder(Component.translatable("globaltags.context.changeTag.placeholder", NamedTextColor.DARK_GRAY)) - .addId("text-field"); - ButtonWidget button = new ButtonWidget() - .updateComponent(Component.translatable("globaltags.context.changeTag.send", NamedTextColor.RED)) - .addId("report-button"); - button.setEnabled(false); - button.setActionListener(() -> { - Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - ApiHandler.setTag(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) - .append(response.getMessage()) - )); - }); - textField.updateListener((text) -> button.setEnabled(!text.isBlank())); + TagCache.resolve(uuid, (info) -> { + FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window"); + HorizontalListWidget profileWrapper = new HorizontalListWidget().addId("header"); + IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); + ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.changeTag.title", this.username).addId("username"); + VerticalListWidget content = new VerticalListWidget<>().addId("content"); + ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.changeTag.label").addId("reason"); + TextFieldWidget textField = new TextFieldWidget() + .placeholder(Component.translatable("globaltags.context.changeTag.placeholder", NamedTextColor.DARK_GRAY)) + .addId("text-field"); + textField.setText(info.getPlainTag() != null ? info.getPlainTag() : ""); + ButtonWidget button = new ButtonWidget() + .updateComponent(Component.translatable("globaltags.context.changeTag.send", NamedTextColor.AQUA)) + .addId("report-button"); + button.setEnabled(!textField.getText().isBlank()); + button.setActionListener(() -> { + Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); + ApiHandler.setTag(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); + }); + textField.updateListener((text) -> button.setEnabled(!text.isBlank())); - profileWrapper.addEntry(headWidget); - profileWrapper.addEntry(titleWidget); + profileWrapper.addEntry(headWidget); + profileWrapper.addEntry(titleWidget); - content.addChild(labelWidget); - content.addChild(textField); - content.addChild(button); + content.addChild(labelWidget); + content.addChild(textField); + content.addChild(button); - windowWidget.addContent(profileWrapper); - windowWidget.addContent(content); - this.document.addChild(windowWidget); + windowWidget.addContent(profileWrapper); + windowWidget.addContent(content); + this.document.addChild(windowWidget); + }); } } diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java index 70915a9..61524cc 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java @@ -41,9 +41,9 @@ public void initialize(Parent parent) { IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.report.title", this.username).addId("username"); VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.reason").addId("reason"); + ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.context.reason").addId("reason"); TextFieldWidget textField = new TextFieldWidget() - .placeholder(Component.translatable("globaltags.placeholder", NamedTextColor.DARK_GRAY)) + .placeholder(Component.translatable("globaltags.context.placeholder", NamedTextColor.DARK_GRAY)) .addId("text-field"); ButtonWidget button = new ButtonWidget() .updateComponent(Component.translatable("globaltags.context.report.send", NamedTextColor.RED)) From 27d27934ac0fda7051376abc8c127d768321c7e8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 02:02:36 +0200 Subject: [PATCH 014/105] Improve changeTag condition --- .../rappytv/globaltags/activities/ChangeTagActivity.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java index af8f30f..60a759c 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java @@ -47,11 +47,12 @@ public void initialize(Parent parent) { TextFieldWidget textField = new TextFieldWidget() .placeholder(Component.translatable("globaltags.context.changeTag.placeholder", NamedTextColor.DARK_GRAY)) .addId("text-field"); - textField.setText(info.getPlainTag() != null ? info.getPlainTag() : ""); + boolean hasTag = info.getPlainTag() != null; + textField.setText(hasTag ? info.getPlainTag() : ""); ButtonWidget button = new ButtonWidget() .updateComponent(Component.translatable("globaltags.context.changeTag.send", NamedTextColor.AQUA)) .addId("report-button"); - button.setEnabled(!textField.getText().isBlank()); + button.setEnabled(!textField.getText().isBlank() && (!hasTag || !textField.getText().equals(info.getPlainTag()))); button.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); ApiHandler.setTag(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( @@ -60,7 +61,7 @@ public void initialize(Parent parent) { .append(response.getMessage()) )); }); - textField.updateListener((text) -> button.setEnabled(!text.isBlank())); + textField.updateListener((text) -> button.setEnabled(!text.isBlank() && (!hasTag || !textField.getText().equals(info.getPlainTag())))); profileWrapper.addEntry(headWidget); profileWrapper.addEntry(titleWidget); From b7fb9922e6361c14d524f7abd56fefc8eddfa852 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 02:04:56 +0200 Subject: [PATCH 015/105] Add placeholder body on resetTag request to bypass elysia bug --- .../java/com/rappytv/globaltags/api/ApiHandler.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index f3198bc..8e43113 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -9,7 +9,6 @@ import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.util.I18n; import net.labymod.api.util.io.web.request.Request.Method; -import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.function.Consumer; @@ -149,7 +148,8 @@ public static void resetTag(UUID uuid, Consumer consumer) { ) { @Override public Map getBody() { - return null; + // https://github.com/elysiajs/elysia/issues/495 + return Map.of("placeholder", "body"); } }; request.sendAsyncRequest((response) -> { @@ -170,9 +170,7 @@ public static void reportPlayer(UUID uuid, String reason, Consumer ) { @Override public Map getBody() { - Map body = new HashMap<>(); - body.put("reason", reason); - return body; + return Map.of("reason", reason); } }; request.sendAsyncRequest((response) -> { @@ -192,9 +190,7 @@ public static void banPlayer(UUID uuid, String reason, Consumer con ) { @Override public Map getBody() { - Map body = new HashMap<>(); - body.put("reason", reason); - return body; + return Map.of("reason", reason); } }; request.sendAsyncRequest((response) -> { From 4ab61cb733bf34786954b7f87ca4e60ca9b4cd0a Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 02:14:18 +0200 Subject: [PATCH 016/105] Rename report.lss to be used multiple times --- .../activities/BanUUIDActivity.java | 26 +++++++++---------- .../activities/ChangeTagActivity.java | 26 +++++++++---------- .../activities/ReportUUIDActivity.java | 26 +++++++++---------- .../fancy/lss/{report.lss => input.lss} | 6 ++--- .../vanilla/lss/{report.lss => input.lss} | 6 ++--- 5 files changed, 45 insertions(+), 45 deletions(-) rename core/src/main/resources/assets/globaltags/themes/fancy/lss/{report.lss => input.lss} (94%) rename core/src/main/resources/assets/globaltags/themes/vanilla/lss/{report.lss => input.lss} (94%) diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java index 28ec0a2..a63bcbb 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java @@ -22,7 +22,7 @@ import java.util.UUID; -@Link("report.lss") +@Link("input.lss") @AutoActivity public class BanUUIDActivity extends SimpleActivity { @@ -42,30 +42,30 @@ public void initialize(Parent parent) { IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.ban.title", this.username).addId("username"); VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.context.reason").addId("reason"); - TextFieldWidget textField = new TextFieldWidget() + ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.reason").addId("label"); + TextFieldWidget inputWidget = new TextFieldWidget() .placeholder(Component.translatable("globaltags.context.placeholder", NamedTextColor.DARK_GRAY)) - .addId("text-field"); - ButtonWidget button = new ButtonWidget() + .addId("input"); + ButtonWidget sendButton = new ButtonWidget() .updateComponent(Component.translatable("globaltags.context.ban.send", NamedTextColor.RED)) - .addId("report-button"); - button.setEnabled(false); - button.setActionListener(() -> { + .addId("send-button"); + sendButton.setEnabled(false); + sendButton.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - ApiHandler.banPlayer(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + ApiHandler.banPlayer(uuid, inputWidget.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( Component .text(GlobalTagAddon.prefix) .append(response.getMessage()) )); }); - textField.updateListener((text) -> button.setEnabled(!text.isBlank())); + inputWidget.updateListener((text) -> sendButton.setEnabled(!text.isBlank())); profileWrapper.addEntry(headWidget); profileWrapper.addEntry(titleWidget); - content.addChild(reasonWidget); - content.addChild(textField); - content.addChild(button); + content.addChild(labelWidget); + content.addChild(inputWidget); + content.addChild(sendButton); windowWidget.addContent(profileWrapper); windowWidget.addContent(content); diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java index 60a759c..ccc89fa 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java @@ -22,7 +22,7 @@ import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; -@Link("report.lss") +@Link("input.lss") @AutoActivity public class ChangeTagActivity extends SimpleActivity { @@ -43,32 +43,32 @@ public void initialize(Parent parent) { IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.changeTag.title", this.username).addId("username"); VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.changeTag.label").addId("reason"); - TextFieldWidget textField = new TextFieldWidget() + ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.changeTag.label").addId("label"); + TextFieldWidget inputWidget = new TextFieldWidget() .placeholder(Component.translatable("globaltags.context.changeTag.placeholder", NamedTextColor.DARK_GRAY)) - .addId("text-field"); + .addId("input"); boolean hasTag = info.getPlainTag() != null; - textField.setText(hasTag ? info.getPlainTag() : ""); - ButtonWidget button = new ButtonWidget() + inputWidget.setText(hasTag ? info.getPlainTag() : ""); + ButtonWidget sendButton = new ButtonWidget() .updateComponent(Component.translatable("globaltags.context.changeTag.send", NamedTextColor.AQUA)) - .addId("report-button"); - button.setEnabled(!textField.getText().isBlank() && (!hasTag || !textField.getText().equals(info.getPlainTag()))); - button.setActionListener(() -> { + .addId("send-button"); + sendButton.setEnabled(!inputWidget.getText().isBlank() && (!hasTag || !inputWidget.getText().equals(info.getPlainTag()))); + sendButton.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - ApiHandler.setTag(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + ApiHandler.setTag(uuid, inputWidget.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( Component .text(GlobalTagAddon.prefix) .append(response.getMessage()) )); }); - textField.updateListener((text) -> button.setEnabled(!text.isBlank() && (!hasTag || !textField.getText().equals(info.getPlainTag())))); + inputWidget.updateListener((text) -> sendButton.setEnabled(!text.isBlank() && (!hasTag || !inputWidget.getText().equals(info.getPlainTag())))); profileWrapper.addEntry(headWidget); profileWrapper.addEntry(titleWidget); content.addChild(labelWidget); - content.addChild(textField); - content.addChild(button); + content.addChild(inputWidget); + content.addChild(sendButton); windowWidget.addContent(profileWrapper); windowWidget.addContent(content); diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java index 61524cc..7bf323d 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java @@ -21,7 +21,7 @@ import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; import java.util.UUID; -@Link("report.lss") +@Link("input.lss") @AutoActivity public class ReportUUIDActivity extends SimpleActivity { @@ -41,30 +41,30 @@ public void initialize(Parent parent) { IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); ComponentWidget titleWidget = ComponentWidget.i18n("globaltags.context.report.title", this.username).addId("username"); VerticalListWidget content = new VerticalListWidget<>().addId("content"); - ComponentWidget reasonWidget = ComponentWidget.i18n("globaltags.context.reason").addId("reason"); - TextFieldWidget textField = new TextFieldWidget() + ComponentWidget labelWidget = ComponentWidget.i18n("globaltags.context.reason").addId("label"); + TextFieldWidget inputWidget = new TextFieldWidget() .placeholder(Component.translatable("globaltags.context.placeholder", NamedTextColor.DARK_GRAY)) - .addId("text-field"); - ButtonWidget button = new ButtonWidget() + .addId("input"); + ButtonWidget sendButton = new ButtonWidget() .updateComponent(Component.translatable("globaltags.context.report.send", NamedTextColor.RED)) - .addId("report-button"); - button.setEnabled(false); - button.setActionListener(() -> { + .addId("send-button"); + sendButton.setEnabled(false); + sendButton.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); - ApiHandler.reportPlayer(uuid, textField.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( + ApiHandler.reportPlayer(uuid, inputWidget.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( Component .text(GlobalTagAddon.prefix) .append(response.getMessage()) )); }); - textField.updateListener((text) -> button.setEnabled(!text.isBlank())); + inputWidget.updateListener((text) -> sendButton.setEnabled(!text.isBlank())); profileWrapper.addEntry(headWidget); profileWrapper.addEntry(titleWidget); - content.addChild(reasonWidget); - content.addChild(textField); - content.addChild(button); + content.addChild(labelWidget); + content.addChild(inputWidget); + content.addChild(sendButton); windowWidget.addContent(profileWrapper); windowWidget.addContent(content); diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/report.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss similarity index 94% rename from core/src/main/resources/assets/globaltags/themes/fancy/lss/report.lss rename to core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss index 9b89b24..1efc3ca 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/report.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss @@ -34,20 +34,20 @@ alignment-y: center; overwrite-width: false; - .reason { + .label { margin-top: 40; alignment-x: center; alignment-y: center; } - .text-field { + .input { margin-top: 6; width: 200; alignment-x: center; alignment-y: center; } - .report-button { + .send-button { margin-top: 5; width: 50; height: 20; diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/report.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss similarity index 94% rename from core/src/main/resources/assets/globaltags/themes/vanilla/lss/report.lss rename to core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss index 90d26aa..54dc30c 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/report.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss @@ -34,20 +34,20 @@ alignment-y: center; overwrite-width: false; - .reason { + .label { margin-top: 40; alignment-x: center; alignment-y: center; } - .text-field { + .input { margin-top: 6; width: 200; alignment-x: center; alignment-y: center; } - .report-button { + .send-button { margin-top: 5; width: 70; height: 20; From 148eddbd93ad0166657398800e14425eeee72638 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 02:15:07 +0200 Subject: [PATCH 017/105] Comment out account center activity for now --- .../rappytv/globaltags/config/GlobalTagConfig.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index f22fad0..9e5a54e 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -45,12 +45,12 @@ public GlobalTagConfig() { @SpriteSlot(size = 32, x = 1) private final TagSubConfig tags = new TagSubConfig(); - @SpriteSlot(size = 32, x = 1) - @MethodOrder(after = "localizedResponses") - @ActivitySetting - public Activity accountCenter() { - return new AccountCenterActivity(); - } +// @SpriteSlot(size = 32, x = 1) +// @MethodOrder(after = "localizedResponses") +// @ActivitySetting +// public Activity accountCenter() { +// return new AccountCenterActivity(); +// } @Override public ConfigProperty enabled() { From d83a9e6841580770a9ba9ae28445752a65926896 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 02:18:21 +0200 Subject: [PATCH 018/105] Optimize imports so builds don't fail --- .../java/com/rappytv/globaltags/config/GlobalTagConfig.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 9e5a54e..a5d4dd4 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -1,11 +1,8 @@ package com.rappytv.globaltags.config; -import com.rappytv.globaltags.activities.AccountCenterActivity; import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.config.subconfig.TagSubConfig; import net.labymod.api.addon.AddonConfig; -import net.labymod.api.client.gui.screen.activity.Activity; -import net.labymod.api.client.gui.screen.widget.widgets.activity.settings.ActivitySettingWidget.ActivitySetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; import net.labymod.api.configuration.loader.annotation.ConfigName; @@ -13,7 +10,6 @@ import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.annotation.SpriteTexture; import net.labymod.api.configuration.loader.property.ConfigProperty; -import net.labymod.api.util.MethodOrder; @ConfigName("settings") @SpriteTexture("settings") From 3cea4d852750c34d84f16f1d3da07b23613ea816 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 03:00:00 +0200 Subject: [PATCH 019/105] Resolve own playerdata after clearing cache --- api/src/main/java/com/rappytv/globaltags/util/Util.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index 8cccf72..032bdf0 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -37,6 +37,7 @@ public static boolean clearCache(boolean notify) { return false; } TagCache.clear(); + TagCache.resolve(Laby.labyAPI().getUniqueId()); return true; } From 346371d0eee7525207ea3656713607c21c6483b2 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 13:25:40 +0200 Subject: [PATCH 020/105] Also allow some bullet points when player does not have a tag --- .../java/com/rappytv/globaltags/interaction/BanBulletPoint.java | 2 +- .../rappytv/globaltags/interaction/ChangeTagBulletPoint.java | 2 +- .../rappytv/globaltags/interaction/ToggleAdminBulletPoint.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java index a3c2b68..e5609d5 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java @@ -32,6 +32,6 @@ public void execute(Player player) { public boolean isVisible(Player player) { PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); PlayerInfo target = TagCache.get(player.getUniqueId()); - return executer != null && executer.isAdmin() && target != null && target.getTag() != null; + return executer != null && executer.isAdmin() && target != null; } } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java index 73b3b9a..c1f138c 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ChangeTagBulletPoint.java @@ -32,6 +32,6 @@ public void execute(Player player) { public boolean isVisible(Player player) { PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); PlayerInfo target = TagCache.get(player.getUniqueId()); - return executer != null && executer.isAdmin() && target != null && target.getTag() != null; + return executer != null && executer.isAdmin() && target != null; } } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java index 79aa066..7efd10d 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java @@ -35,6 +35,6 @@ public void execute(Player player) { public boolean isVisible(Player player) { PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); PlayerInfo target = TagCache.get(player.getUniqueId()); - return executer != null && executer.isAdmin() && target != null && target.getTag() != null; + return executer != null && executer.isAdmin() && target != null; } } From 2ba1dd97ec5179c5a7af28a96f58ee1362e1959e Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 13:26:26 +0200 Subject: [PATCH 021/105] Clear cache on some more requests --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 8e43113..9000167 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -199,6 +199,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); + Util.clearCache(false); }); } @@ -219,6 +220,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); + Util.clearCache(false); }); } From 5030a72e582048ff39a1bbfc8e35df3b12827d24 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 13:43:11 +0200 Subject: [PATCH 022/105] Fix toggleAdmin request (idk why the body problem still occurs) --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 9000167..6017b77 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -211,7 +211,8 @@ public static void toggleAdmin(UUID uuid, Consumer consumer) { ) { @Override public Map getBody() { - return null; + // https://github.com/elysiajs/elysia/issues/495 + return Map.of("placeholder", "body"); } }; request.sendAsyncRequest((response) -> { From e12c9dd7b1dd4241003e442f1e1d8ae658327b45 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 13:45:16 +0200 Subject: [PATCH 023/105] Print request exceptions --- api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java index eccda29..1bac1a7 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java @@ -52,6 +52,7 @@ public void sendAsyncRequest(Callback callback) { successful = false; error = response.exception().getMessage(); callback.accept(response); + response.exception().printStackTrace(); return; } responseBody = gson.fromJson(response.get(), ResponseBody.class); From d45f50266b7838f21fb7faa1d6d2f452bf450487 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:00:45 +0200 Subject: [PATCH 024/105] Get ban info, add ApiHandler#unbanPlayer --- .../rappytv/globaltags/api/ApiHandler.java | 24 ++++++++++++++++++- .../rappytv/globaltags/api/ResponseBody.java | 6 +++++ .../rappytv/globaltags/types/PlayerInfo.java | 14 ++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 6017b77..972e344 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -55,7 +55,8 @@ public Map getBody() { request.responseBody.tag, request.responseBody.position, request.responseBody.icon, - request.responseBody.admin + request.responseBody.admin, + request.responseBody.ban )); }); } @@ -203,6 +204,27 @@ public Map getBody() { }); } + public static void unbanPlayer(UUID uuid, String reason, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.DELETE, + "/players/" + uuid + "/ban", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return null; + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); + return; + } + consumer.accept(new ApiResponse(true, request.getMessage())); + Util.clearCache(false); + }); + } + public static void toggleAdmin(UUID uuid, Consumer consumer) { ApiRequest request = new ApiRequest( Method.POST, diff --git a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java index 891a756..79e9644 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java @@ -8,10 +8,16 @@ public class ResponseBody { public String icon; public boolean admin; public String message; + public Ban ban; // For errors public String error; // Version public String version; + + public static class Ban { + public boolean active; + public String reason; + } } diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 2e9dbd3..463774e 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -1,5 +1,6 @@ package com.rappytv.globaltags.types; +import com.rappytv.globaltags.api.ResponseBody.Ban; import com.rappytv.globaltags.util.Util; import net.labymod.api.client.component.Component; import net.labymod.api.client.entity.player.tag.PositionType; @@ -17,14 +18,16 @@ public class PlayerInfo { private final String position; private final String icon; private final boolean admin; + private final Ban ban; - public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean admin) { + public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean admin, Ban ban) { this.uuid = uuid; this.tag = Util.translateColorCodes(tag); this.plainTag = tag; this.position = position; this.icon = icon; this.admin = admin; + this.ban = ban; } public UUID getUUID() { @@ -73,4 +76,13 @@ public Icon getIcon() { public boolean isAdmin() { return admin; } + + public boolean isBanned() { + return ban != null && ban.active; + } + + public String getBanReason() { + if(ban == null) return null; + return ban.reason; + } } From a54cfca4ab5e1c9e7642faa86bec8387e5a47f1b Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:13:18 +0200 Subject: [PATCH 025/105] Remove unused parameter field in ApiHandler#unbanPlayer --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 972e344..66317fd 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -204,7 +204,7 @@ public Map getBody() { }); } - public static void unbanPlayer(UUID uuid, String reason, Consumer consumer) { + public static void unbanPlayer(UUID uuid, Consumer consumer) { ApiRequest request = new ApiRequest( Method.DELETE, "/players/" + uuid + "/ban", @@ -212,7 +212,8 @@ public static void unbanPlayer(UUID uuid, String reason, Consumer c ) { @Override public Map getBody() { - return null; + // https://github.com/elysiajs/elysia/issues/495 + return Map.of("placeholder", "body"); } }; request.sendAsyncRequest((response) -> { From 34c56aa90e6fbc1225256a141a8d3828b7b86748 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:13:54 +0200 Subject: [PATCH 026/105] Rename BanUUIDActivity --- .../activities/{BanUUIDActivity.java => BanActivity.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename core/src/main/java/com/rappytv/globaltags/activities/{BanUUIDActivity.java => BanActivity.java} (96%) diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java similarity index 96% rename from core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java rename to core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java index a63bcbb..f489a1d 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/BanUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java @@ -24,12 +24,12 @@ @Link("input.lss") @AutoActivity -public class BanUUIDActivity extends SimpleActivity { +public class BanActivity extends SimpleActivity { private final UUID uuid; private final String username; - public BanUUIDActivity(UUID uuid, String username) { + public BanActivity(UUID uuid, String username) { this.uuid = uuid; this.username = username; } From c942cc66b6e9f1b20e7a71027c8b2b616606ecec Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:16:32 +0200 Subject: [PATCH 027/105] Make ToggleBanBulletPoint and ToggleAdminBulletPoint respect the player's current ban/admin state --- .../interaction/BanBulletPoint.java | 37 ------------- .../interaction/ToggleAdminBulletPoint.java | 6 ++- .../interaction/ToggleBanBulletPoint.java | 52 +++++++++++++++++++ 3 files changed, 56 insertions(+), 39 deletions(-) delete mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java create mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java deleted file mode 100644 index e5609d5..0000000 --- a/core/src/main/java/com/rappytv/globaltags/interaction/BanBulletPoint.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.rappytv.globaltags.interaction; - -import com.rappytv.globaltags.activities.BanUUIDActivity; -import com.rappytv.globaltags.types.PlayerInfo; -import com.rappytv.globaltags.util.TagCache; -import net.labymod.api.Laby; -import net.labymod.api.client.component.Component; -import net.labymod.api.client.entity.player.Player; -import net.labymod.api.client.entity.player.interaction.BulletPoint; -import net.labymod.api.client.gui.icon.Icon; - -public class BanBulletPoint implements BulletPoint { - - @Override - public Component getTitle() { - return Component.translatable("globaltags.context.ban.name"); - } - - @Override - public Icon getIcon() { - return null; - } - - @Override - public void execute(Player player) { - Laby.labyAPI().minecraft().executeNextTick(() -> - Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new BanUUIDActivity(player.getUniqueId(), player.getName())) - ); - } - - @Override - public boolean isVisible(Player player) { - PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); - PlayerInfo target = TagCache.get(player.getUniqueId()); - return executer != null && executer.isAdmin() && target != null; - } -} diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java index 7efd10d..da233d2 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java @@ -12,9 +12,11 @@ public class ToggleAdminBulletPoint implements BulletPoint { + private PlayerInfo target; + @Override public Component getTitle() { - return Component.translatable("globaltags.context.toggleAdmin.name"); + return Component.translatable("globaltags.context.admin." + (target.isAdmin() ? "remove" : "set")); } @Override @@ -34,7 +36,7 @@ public void execute(Player player) { @Override public boolean isVisible(Player player) { PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); - PlayerInfo target = TagCache.get(player.getUniqueId()); + target = TagCache.get(player.getUniqueId()); return executer != null && executer.isAdmin() && target != null; } } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java new file mode 100644 index 0000000..c3a8c74 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java @@ -0,0 +1,52 @@ +package com.rappytv.globaltags.interaction; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.activities.BanActivity; +import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; + +public class ToggleBanBulletPoint implements BulletPoint { + + private PlayerInfo target; + + @Override + public Component getTitle() { + return Component.translatable("globaltags.context." + (target.isBanned() ? "unban" : "ban") + ".name"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + if(target.isBanned()) { + ApiHandler.unbanPlayer(target.getUUID(), (response) -> Laby.references().chatExecutor().displayClientMessage( + Component + .text(GlobalTagAddon.prefix) + .append(response.getMessage()) + )); + } else { + Laby.labyAPI().minecraft().executeNextTick(() -> + Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new BanActivity( + player.getUniqueId(), + player.getName() + )) + ); + } + } + + @Override + public boolean isVisible(Player player) { + PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); + target = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && target != null; + } +} From b9518a82a87416ba334fc7f198c53da533fc77ff Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:19:47 +0200 Subject: [PATCH 028/105] Always clear cache and add own playerinfo instantly --- .../com/rappytv/globaltags/api/ApiHandler.java | 14 +++++++------- .../java/com/rappytv/globaltags/util/Util.java | 11 +---------- .../com/rappytv/globaltags/GlobalTagAddon.java | 8 ++++---- .../command/subcommands/ClearCacheCommand.java | 2 +- .../globaltags/config/subconfig/TagSubConfig.java | 12 ++++++------ .../listener/ServerNavigationListener.java | 2 +- 6 files changed, 20 insertions(+), 29 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 66317fd..da55375 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -82,7 +82,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); })); } @@ -107,7 +107,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(false, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); }); } @@ -133,7 +133,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); }); } @@ -159,7 +159,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); }); } @@ -200,7 +200,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); }); } @@ -222,7 +222,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); }); } @@ -244,7 +244,7 @@ public Map getBody() { return; } consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(false); + Util.clearCache(); }); } diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index 032bdf0..78a809d 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -8,7 +8,6 @@ import net.labymod.api.labyconnect.TokenStorage.Token; import net.labymod.api.notification.Notification; import net.labymod.api.notification.Notification.Type; -import net.labymod.api.util.I18n; import org.jetbrains.annotations.Nullable; public class Util { @@ -28,17 +27,9 @@ public static Component translateColorCodes(String string) { .deserialize(string); } - public static boolean clearCache(boolean notify) { - if(TagCache.isEmpty()) { - if(notify) Util.notify( - I18n.translate("globaltags.notifications.error"), - I18n.translate("globaltags.notifications.cacheEmpty") - ); - return false; - } + public static void clearCache() { TagCache.clear(); TagCache.resolve(Laby.labyAPI().getUniqueId()); - return true; } public static @Nullable String getSessionToken() { diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 94fbac2..02d00f4 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -3,7 +3,7 @@ import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.command.GlobalTagCommand; import com.rappytv.globaltags.config.GlobalTagConfig; -import com.rappytv.globaltags.interaction.BanBulletPoint; +import com.rappytv.globaltags.interaction.ToggleBanBulletPoint; import com.rappytv.globaltags.interaction.ChangeTagBulletPoint; import com.rappytv.globaltags.interaction.ClearTagBulletPoint; import com.rappytv.globaltags.interaction.ReportBulletPoint; @@ -49,7 +49,7 @@ protected void enable() { new CustomTag(this, positionType) ); registerListener(new ServerNavigationListener()); - labyAPI().interactionMenuRegistry().register(new BanBulletPoint()); + labyAPI().interactionMenuRegistry().register(new ToggleBanBulletPoint()); labyAPI().interactionMenuRegistry().register(new ChangeTagBulletPoint()); labyAPI().interactionMenuRegistry().register(new ClearTagBulletPoint()); labyAPI().interactionMenuRegistry().register(new ReportBulletPoint()); @@ -60,9 +60,9 @@ protected void enable() { new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { - Util.clearCache(false); + Util.clearCache(); } - }, 0, 1000 * 60 * 5); + }, 1000 * 10, 1000 * 60 * 5); } @Override diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java index b39cb31..abe708e 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java @@ -13,7 +13,7 @@ public ClearCacheCommand() { @Override public boolean execute(String prefix, String[] arguments) { - displayMessage(GlobalTagAddon.prefix + (Util.clearCache(false) ? "§a" + I18n.translate("globaltags.notifications.cacheCleared") : "§c" + I18n.translate("globaltags.notifications.cacheEmpty"))); + displayMessage(GlobalTagAddon.prefix + I18n.translate("globaltags.notifications.cacheCleared")); return true; } } diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 46c12c8..563fcc3 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -39,7 +39,7 @@ public TagSubConfig() { public void setTag(Setting setting) { ApiHandler.setTag(tag.get(), (info) -> {}); tag.set(""); - Util.clearCache(false); + Util.clearCache(); } @DropdownSetting @@ -62,10 +62,10 @@ public void resetTag(Setting setting) { @ButtonSetting @SpriteSlot(size = 32, y = 2) public void clearCache(Setting setting) { - if(Util.clearCache(true)) - Util.notify( - I18n.translate("globaltags.notifications.success"), - I18n.translate("globaltags.notifications.cacheCleared") - ); + Util.clearCache(); + Util.notify( + I18n.translate("globaltags.notifications.success"), + I18n.translate("globaltags.notifications.cacheCleared") + ); } } diff --git a/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java b/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java index b16837c..66daab8 100644 --- a/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java +++ b/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java @@ -8,6 +8,6 @@ public class ServerNavigationListener { @Subscribe public void onLeave(ServerDisconnectEvent event) { - Util.clearCache(false); + Util.clearCache(); } } From 3a4b59b03c053124637698ea9783012f8448821c Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:21:36 +0200 Subject: [PATCH 029/105] Add unban/toggleAdmin translations, remove cacheEmpty string --- .../resources/assets/globaltags/i18n/en_us.json | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 6c5430e..2ed9ee8 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -73,14 +73,10 @@ } } }, - "activity": { - "newtag": "New Tag" - }, "notifications": { "success": "Success!", "error": "An error ocurred", - "cacheCleared": "The cache was cleared!", - "cacheEmpty": "The cache is already empty!" + "cacheCleared": "The cache was cleared!" }, "messages": { "clearCache": "Clear cache", @@ -100,6 +96,11 @@ "title": "Ban %s", "send": "Ban" }, + "unban": { + "name": "Unban GlobalTag player", + "title": "Unban %s", + "send": "Unban" + }, "changeTag": { "name": "Change GlobalTag", "title": "Change %s's Tag", @@ -110,8 +111,9 @@ "clearTag": { "name": "Clear GlobalTag" }, - "toggleAdmin": { - "name": "Toggle GlobalTag Admin" + "admin": { + "set": "Make GlobalTag Admin", + "remove": "Remove GlobalTag Admin" } } } From cd3e00534e5f8570f05d5f04e9b62af15a05a3c8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 9 Jun 2024 14:21:57 +0200 Subject: [PATCH 030/105] Bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 93665b5..5b0a50e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,7 @@ labyMod { author = "RappyTV" description = "Get yourself a custom Globaltag that's publicly visible to anyone using this addon." minecraftVersion = "*" - version = System.getenv().getOrDefault("VERSION", "1.1.9") + version = System.getenv().getOrDefault("VERSION", "1.2.0") } minecraft { From 91bd6b259220d3e15365862b168f8f91bb6a6cd8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 00:24:30 +0200 Subject: [PATCH 031/105] Use component system only --- .../java/com/rappytv/globaltags/GlobalTagAddon.java | 7 ++++++- .../com/rappytv/globaltags/activities/BanActivity.java | 4 ++-- .../globaltags/activities/ChangeTagActivity.java | 4 ++-- .../globaltags/activities/ReportUUIDActivity.java | 4 ++-- .../rappytv/globaltags/command/GlobalTagCommand.java | 9 +++++++-- .../command/subcommands/ClearCacheCommand.java | 10 +++++++--- .../globaltags/interaction/ClearTagBulletPoint.java | 4 ++-- .../globaltags/interaction/ToggleAdminBulletPoint.java | 4 ++-- .../globaltags/interaction/ToggleBanBulletPoint.java | 4 ++-- 9 files changed, 32 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 02d00f4..5f43271 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -13,6 +13,9 @@ import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; import net.labymod.api.addon.LabyAddon; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.client.component.format.TextDecoration; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.entity.player.tag.TagRegistry; import net.labymod.api.models.addon.annotation.AddonMain; @@ -24,7 +27,9 @@ @AddonMain public class GlobalTagAddon extends LabyAddon { - public static String prefix = "§1§lGlobalTags §8» §f"; + public static Component prefix = Component.empty() + .append(Component.text("GlobalTags").color(NamedTextColor.BLUE).decorate(TextDecoration.BOLD)) + .append(Component.text(" » ", NamedTextColor.DARK_GRAY)); private static GlobalTagAddon addon; @Override diff --git a/core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java index f489a1d..56f3a35 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/BanActivity.java @@ -53,8 +53,8 @@ public void initialize(Parent parent) { sendButton.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); ApiHandler.banPlayer(uuid, inputWidget.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) + Component.empty() + .append(GlobalTagAddon.prefix) .append(response.getMessage()) )); }); diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java index ccc89fa..e3712c2 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ChangeTagActivity.java @@ -56,8 +56,8 @@ public void initialize(Parent parent) { sendButton.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); ApiHandler.setTag(uuid, inputWidget.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) + Component.empty() + .append(GlobalTagAddon.prefix) .append(response.getMessage()) )); }); diff --git a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java index 7bf323d..cd5670c 100644 --- a/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java +++ b/core/src/main/java/com/rappytv/globaltags/activities/ReportUUIDActivity.java @@ -52,8 +52,8 @@ public void initialize(Parent parent) { sendButton.setActionListener(() -> { Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); ApiHandler.reportPlayer(uuid, inputWidget.getText(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) + Component.empty() + .append(GlobalTagAddon.prefix) .append(response.getMessage()) )); }); diff --git a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java index d60e897..9a60a52 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java @@ -25,8 +25,13 @@ public GlobalTagCommand() { public boolean execute(String prefix, String[] arguments) { ApiHandler.getVersion((version) -> { TextComponent clearComponent = TextComponent.builder() - .append(GlobalTagAddon.prefix + "§aVersion: §b" + ApiRequest.version + "\n") - .append(GlobalTagAddon.prefix + "§aAPI Version: " + (version != null ? "§b" + version : "§c" + I18n.translate("globaltags.messages.offline")) + "\n") + .append(GlobalTagAddon.prefix) + .append(Component.text("Version: ", NamedTextColor.GREEN)) + .append(Component.text(ApiRequest.version + "\n", NamedTextColor.AQUA)) + .append(GlobalTagAddon.prefix) + .append(Component.text("API Version: ", NamedTextColor.GREEN)) + .append(version != null ? Component.text(version, NamedTextColor.GREEN) : Component.translatable("globaltags.messages.offline", NamedTextColor.RED)) + .append("\n") .append(GlobalTagAddon.prefix) .append(Component .translatable("globaltags.messages.clearCache") diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java index abe708e..485c48b 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java @@ -1,9 +1,9 @@ package com.rappytv.globaltags.command.subcommands; import com.rappytv.globaltags.GlobalTagAddon; -import com.rappytv.globaltags.util.Util; import net.labymod.api.client.chat.command.SubCommand; -import net.labymod.api.util.I18n; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; public class ClearCacheCommand extends SubCommand { @@ -13,7 +13,11 @@ public ClearCacheCommand() { @Override public boolean execute(String prefix, String[] arguments) { - displayMessage(GlobalTagAddon.prefix + I18n.translate("globaltags.notifications.cacheCleared")); + displayMessage( + Component.empty() + .append(GlobalTagAddon.prefix) + .append(Component.translatable("globaltags.notifications.cacheCleared", NamedTextColor.GREEN)) + ); return true; } } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java index b9c23aa..859cc49 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ClearTagBulletPoint.java @@ -25,8 +25,8 @@ public Icon getIcon() { @Override public void execute(Player player) { ApiHandler.resetTag(player.getUniqueId(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) + Component.empty() + .append(GlobalTagAddon.prefix) .append(response.getMessage()) )); } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java index da233d2..c8742f7 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleAdminBulletPoint.java @@ -27,8 +27,8 @@ public Icon getIcon() { @Override public void execute(Player player) { ApiHandler.toggleAdmin(player.getUniqueId(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) + Component.empty() + .append(GlobalTagAddon.prefix) .append(response.getMessage()) )); } diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java index c3a8c74..26a9a09 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java @@ -29,8 +29,8 @@ public Icon getIcon() { public void execute(Player player) { if(target.isBanned()) { ApiHandler.unbanPlayer(target.getUUID(), (response) -> Laby.references().chatExecutor().displayClientMessage( - Component - .text(GlobalTagAddon.prefix) + Component.empty() + .append(GlobalTagAddon.prefix) .append(response.getMessage()) )); } else { From 5afc09083d3480cbd4ced38a89aa86c21bb11f5f Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 00:26:25 +0200 Subject: [PATCH 032/105] Use getters and setters for ApiRequest field --- .../com/rappytv/globaltags/api/ApiRequest.java | 16 +++++++++++++--- .../com/rappytv/globaltags/GlobalTagAddon.java | 2 +- .../globaltags/command/GlobalTagCommand.java | 2 +- .../globaltags/config/GlobalTagConfig.java | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java index 1bac1a7..69ad96b 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java @@ -11,8 +11,8 @@ public abstract class ApiRequest { - public static boolean localizedResponses; - public static String version; + private static boolean localizedResponses; + private static String version; private final Gson gson = new Gson(); private boolean successful; @@ -32,7 +32,7 @@ public ApiRequest(Method method, String path, String key) { public void sendAsyncRequest(Callback callback) { GsonRequest request = Request.ofGson(JsonObject.class) - .url("https://gt.rappytv.com" + path) + .url("http://localhost:5000" + path) .method(method) .addHeader("Content-Type", "application/json") .addHeader("Authorization", key != null ? key : "") @@ -80,4 +80,14 @@ public String getError() { return error; } public abstract Map getBody(); + + public static void useLocalizedResponses(boolean value) { + localizedResponses = value; + } + public static void addonVersion(String value) { + version = value; + } + public static String getVersion() { + return version; + } } diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 5f43271..80b72fe 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -43,7 +43,7 @@ protected void preConfigurationLoad() { @Override protected void enable() { registerSettingCategory(); - ApiRequest.version = addon.addonInfo().getVersion(); + ApiRequest.addonVersion(addon.addonInfo().getVersion()); TagRegistry tagRegistry = labyAPI().tagRegistry(); for (PositionType positionType : PositionType.values()) diff --git a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java index 9a60a52..f3f7414 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java @@ -27,7 +27,7 @@ public boolean execute(String prefix, String[] arguments) { TextComponent clearComponent = TextComponent.builder() .append(GlobalTagAddon.prefix) .append(Component.text("Version: ", NamedTextColor.GREEN)) - .append(Component.text(ApiRequest.version + "\n", NamedTextColor.AQUA)) + .append(Component.text(ApiRequest.getVersion() + "\n", NamedTextColor.AQUA)) .append(GlobalTagAddon.prefix) .append(Component.text("API Version: ", NamedTextColor.GREEN)) .append(version != null ? Component.text(version, NamedTextColor.GREEN) : Component.translatable("globaltags.messages.offline", NamedTextColor.RED)) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index a5d4dd4..418aab5 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -17,7 +17,7 @@ public class GlobalTagConfig extends AddonConfig { public GlobalTagConfig() { localizedResponses.addChangeListener((property, oldValue, newValue) -> - ApiRequest.localizedResponses = newValue + ApiRequest.useLocalizedResponses(newValue) ); } From 376c194d5aff12c0fb33fdfdd8286a97ac61f120 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 00:30:03 +0200 Subject: [PATCH 033/105] Fix wrong color for API Version --- .../java/com/rappytv/globaltags/command/GlobalTagCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java index f3f7414..57ae815 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java @@ -30,7 +30,7 @@ public boolean execute(String prefix, String[] arguments) { .append(Component.text(ApiRequest.getVersion() + "\n", NamedTextColor.AQUA)) .append(GlobalTagAddon.prefix) .append(Component.text("API Version: ", NamedTextColor.GREEN)) - .append(version != null ? Component.text(version, NamedTextColor.GREEN) : Component.translatable("globaltags.messages.offline", NamedTextColor.RED)) + .append(version != null ? Component.text(version, NamedTextColor.AQUA) : Component.translatable("globaltags.messages.offline", NamedTextColor.RED)) .append("\n") .append(GlobalTagAddon.prefix) .append(Component From 412ce84a8ed497762116d6e2b91bad0d8a00d384 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 00:47:30 +0200 Subject: [PATCH 034/105] Remove unused method in TagCache, prevent constructing TagCache --- api/src/main/java/com/rappytv/globaltags/util/TagCache.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java index 3862df8..dc60004 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -11,6 +11,8 @@ public class TagCache { + private TagCache() {} + private static final Map cache = new HashMap<>(); private static final Set resolving = new HashSet<>(); @@ -39,9 +41,6 @@ public static void resolve(UUID uuid, Consumer consumer) { resolve(uuid, consumer); }); } - public static boolean isEmpty() { - return cache.isEmpty(); - } public static void clear() { cache.clear(); } From 55828c33a0438f592180c484a83b410187692e40 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 00:48:06 +0200 Subject: [PATCH 035/105] Prevent ApiHandler construction --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index da55375..36fab38 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -16,6 +16,8 @@ @SuppressWarnings("unused") public class ApiHandler { + private ApiHandler() {} + public static void getVersion(Consumer consumer) { ApiRequest request = new ApiRequest( Method.GET, From aba68279121909f27e0cb72ef8f79ea223a41eca Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 00:48:18 +0200 Subject: [PATCH 036/105] Fix /gt cc command functionality --- .../globaltags/command/subcommands/ClearCacheCommand.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java index 485c48b..ccf19ab 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java @@ -1,6 +1,7 @@ package com.rappytv.globaltags.command.subcommands; import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.util.Util; import net.labymod.api.client.chat.command.SubCommand; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; @@ -13,6 +14,7 @@ public ClearCacheCommand() { @Override public boolean execute(String prefix, String[] arguments) { + Util.clearCache(); displayMessage( Component.empty() .append(GlobalTagAddon.prefix) From 70be260e99cd61a8e62522a0f3ba5374722895c2 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 01:53:52 +0200 Subject: [PATCH 037/105] Remove old account center activity --- .../com/rappytv/globaltags/config/GlobalTagConfig.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 418aab5..3f776a8 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -41,13 +41,6 @@ public GlobalTagConfig() { @SpriteSlot(size = 32, x = 1) private final TagSubConfig tags = new TagSubConfig(); -// @SpriteSlot(size = 32, x = 1) -// @MethodOrder(after = "localizedResponses") -// @ActivitySetting -// public Activity accountCenter() { -// return new AccountCenterActivity(); -// } - @Override public ConfigProperty enabled() { return enabled; @@ -61,4 +54,7 @@ public ConfigProperty tagSize() { public ConfigProperty showBackground() { return showBackground; } + public TagSubConfig tagSubConfig() { + return tags; + } } From 9cc10dc674caf56a16616bace2d483d9660a1d30 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 01:54:15 +0200 Subject: [PATCH 038/105] Rearrange stuff, add method to fetch tag --- .../config/subconfig/TagSubConfig.java | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 563fcc3..93cfae9 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -1,7 +1,9 @@ package com.rappytv.globaltags.config.subconfig; import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.config.widget.TagPreviewWidget.TagPreviewSetting; import com.rappytv.globaltags.types.GlobalIcon; +import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; import net.labymod.api.client.entity.player.tag.PositionType; @@ -15,44 +17,39 @@ import net.labymod.api.util.I18n; import net.labymod.api.util.MethodOrder; -@Deprecated public class TagSubConfig extends Config { - public TagSubConfig() { - position.addChangeListener((property, oldValue, newValue) -> { - if(Laby.labyAPI().isFullyInitialized()) - ApiHandler.setPosition(newValue, (info) -> {}); - }); - globalIcon.addChangeListener((property, oldValue, newValue) -> { - if(Laby.labyAPI().isFullyInitialized()) - ApiHandler.setIcon(newValue, (info) -> {}); - }); + public void fetchTag() { + TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> tag.set(info.getPlainTag() != null ? info.getPlainTag() : "")); } + @TagPreviewSetting + private final ConfigProperty tagPreview = new ConfigProperty<>(false); + @TextFieldSetting @SpriteSlot(size = 32, y = 1) private final ConfigProperty tag = new ConfigProperty<>(""); - @MethodOrder(after = "tag") - @ButtonSetting - @SpriteSlot(size = 32, y = 1, x = 1) - public void setTag(Setting setting) { - ApiHandler.setTag(tag.get(), (info) -> {}); - tag.set(""); - Util.clearCache(); - } - @DropdownSetting @SpriteSlot(size = 32, x = 3) private final ConfigProperty position = new ConfigProperty<>(PositionType.ABOVE_NAME); - @DropdownSetting @SpriteSlot(size = 32, y = 1, x = 2) private final ConfigProperty globalIcon = new ConfigProperty<>(GlobalIcon.NONE); @MethodOrder(after = "globalIcon") @ButtonSetting + @SpriteSlot(size = 32, y = 1, x = 1) + public void updateSettings(Setting setting) { + ApiHandler.setTag(tag.get(), (info) -> {}); + ApiHandler.setPosition(position.get(), (info) -> {}); + ApiHandler.setIcon(globalIcon.get(), (info) -> {}); + Util.clearCache(); + } + + @MethodOrder(after = "updateSettings") + @ButtonSetting @SpriteSlot(size = 32, y = 1, x = 3) public void resetTag(Setting setting) { ApiHandler.resetTag((info) -> {}); From 6a4c3b18df775176c46a9adb59a6890c71783f00 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 01:54:31 +0200 Subject: [PATCH 039/105] Add empty lss files for tag preview --- .../resources/assets/globaltags/themes/fancy/lss/center.lss | 0 .../resources/assets/globaltags/themes/vanilla/lss/center.lss | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss create mode 100644 core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss new file mode 100644 index 0000000..e69de29 diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss new file mode 100644 index 0000000..4cfc38e --- /dev/null +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss @@ -0,0 +1,3 @@ +.tag { + width: 20; +} \ No newline at end of file From 8c7ffe98c87ad1f8ad38e52f34b1728a4c989e86 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 01:54:45 +0200 Subject: [PATCH 040/105] Add empty tag preview widget --- .../config/widget/TagPreviewWidget.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java new file mode 100644 index 0000000..fd61be5 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -0,0 +1,52 @@ +package com.rappytv.globaltags.config.widget; + +import net.labymod.api.client.gui.lss.property.annotation.AutoWidget; +import net.labymod.api.client.gui.screen.Parent; +import net.labymod.api.client.gui.screen.activity.Link; +import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.FlexibleContentWidget; +import net.labymod.api.configuration.settings.Setting; +import net.labymod.api.configuration.settings.accessor.SettingAccessor; +import net.labymod.api.configuration.settings.annotation.SettingElement; +import net.labymod.api.configuration.settings.annotation.SettingFactory; +import net.labymod.api.configuration.settings.annotation.SettingWidget; +import net.labymod.api.configuration.settings.widget.WidgetFactory; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Link("center.lss") +@AutoWidget +@SettingWidget +public class TagPreviewWidget extends FlexibleContentWidget { + + @Override + public void initialize(Parent parent) { + super.initialize(parent); + + ComponentWidget tag = ComponentWidget.text("Test").addId("tag"); + this.addContent(tag); + } + + @SettingFactory + public static class Factory implements WidgetFactory { + + @Override + public TagPreviewWidget[] create(Setting setting, TagPreviewSetting annotation, SettingAccessor accessor) { + return new TagPreviewWidget[]{new TagPreviewWidget()}; + } + + @Override + public Class[] types() { + return new Class[0]; + } + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + @SettingElement(extended = true) + public @interface TagPreviewSetting { + + } +} From e141947b5d760eda10c261bb6f69f931e33501da Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 20:50:50 +0200 Subject: [PATCH 041/105] Add tag preview prototype --- .../config/widget/TagPreviewWidget.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index fd61be5..b5f6746 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -1,10 +1,16 @@ package com.rappytv.globaltags.config.widget; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.gui.icon.Icon; import net.labymod.api.client.gui.lss.property.annotation.AutoWidget; import net.labymod.api.client.gui.screen.Parent; import net.labymod.api.client.gui.screen.activity.Link; import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; -import net.labymod.api.client.gui.screen.widget.widgets.layout.FlexibleContentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; +import net.labymod.api.client.resources.ResourceLocation; import net.labymod.api.configuration.settings.Setting; import net.labymod.api.configuration.settings.accessor.SettingAccessor; import net.labymod.api.configuration.settings.annotation.SettingElement; @@ -19,14 +25,27 @@ @Link("center.lss") @AutoWidget @SettingWidget -public class TagPreviewWidget extends FlexibleContentWidget { +public class TagPreviewWidget extends HorizontalListWidget { + + private final Icon adminIcon = Icon.texture(ResourceLocation.create( + "globaltags", + "textures/icons/staff.png" + )); @Override public void initialize(Parent parent) { super.initialize(parent); - ComponentWidget tag = ComponentWidget.text("Test").addId("tag"); - this.addContent(tag); + TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> Laby.labyAPI().minecraft().executeOnRenderThread(() -> { + if(info == null) { + System.out.println("Info is null"); + return; + } + ComponentWidget tag = ComponentWidget.component(info.getTag() != null ? info.getTag() : Component.empty()).addId("tag"); + if(!info.getIconName().equals("NONE")) this.addEntry(new IconWidget(info.getIcon()).addId("icon")); + this.addEntry(tag); + if(info.isAdmin()) this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); + })); } @SettingFactory From 60c5a449e53c044c62c56a803a0fdd7163fe44e3 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 20:51:12 +0200 Subject: [PATCH 042/105] Update translations --- .../resources/assets/globaltags/i18n/en_us.json | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 2ed9ee8..cb592e1 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -20,13 +20,11 @@ }, "tags": { "name": "Tag settings", - "tag": { - "name": "Global tag", - "description": "This tag gets published as soon as you press the button below." + "tagPreview": { + "name": "Tag Preview" }, - "setTag": { - "name": "Set tag you entered in the text field", - "text": "Click" + "tag": { + "name": "Global tag" }, "position": { "name": "Global position", @@ -62,6 +60,10 @@ "youtube": "YouTube" } }, + "updateSettings": { + "name": "Publish settings", + "text": "Click" + }, "resetTag": { "name": "Delete global tag", "text": "Delete" From 4e4b77fe71761bd6872bc5d1867f60ab6224438b Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 20:51:25 +0200 Subject: [PATCH 043/105] Add account center style --- .../globaltags/themes/fancy/lss/center.lss | 17 +++++++++++++++++ .../globaltags/themes/vanilla/lss/center.lss | 18 ++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss index e69de29..cef2271 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss @@ -0,0 +1,17 @@ +TagPreview { + height: 20; + orientation: horizontal; + + .icon { + margin-left: 1; + margin-right: 3; + height: 16; + width: height; + } + + .staff-icon { + margin-left: 2; + height: 11; + width: height; + } +} \ No newline at end of file diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss index 4cfc38e..cef2271 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss @@ -1,3 +1,17 @@ -.tag { - width: 20; +TagPreview { + height: 20; + orientation: horizontal; + + .icon { + margin-left: 1; + margin-right: 3; + height: 16; + width: height; + } + + .staff-icon { + margin-left: 2; + height: 11; + width: height; + } } \ No newline at end of file From 298a0df6cd8c182d9772d6b55d41e3fd98d7bc4e Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 20:53:17 +0200 Subject: [PATCH 044/105] Rename account center lss --- .../com/rappytv/globaltags/config/widget/TagPreviewWidget.java | 2 +- .../globaltags/themes/fancy/lss/{center.lss => preview.lss} | 0 .../globaltags/themes/vanilla/lss/{center.lss => preview.lss} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename core/src/main/resources/assets/globaltags/themes/fancy/lss/{center.lss => preview.lss} (100%) rename core/src/main/resources/assets/globaltags/themes/vanilla/lss/{center.lss => preview.lss} (100%) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index b5f6746..60932c7 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -22,7 +22,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -@Link("center.lss") +@Link("preview.lss") @AutoWidget @SettingWidget public class TagPreviewWidget extends HorizontalListWidget { diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss similarity index 100% rename from core/src/main/resources/assets/globaltags/themes/fancy/lss/center.lss rename to core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss similarity index 100% rename from core/src/main/resources/assets/globaltags/themes/vanilla/lss/center.lss rename to core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss From 2dd08a0d76c6f05b6687cda89360b98708a73333 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 21:34:30 +0200 Subject: [PATCH 045/105] Add tag preview of live tag --- .../config/widget/TagPreviewWidget.java | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 60932c7..ee82f08 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -1,6 +1,8 @@ package com.rappytv.globaltags.config.widget; +import com.rappytv.globaltags.types.PlayerInfo; import com.rappytv.globaltags.util.TagCache; +import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; import net.labymod.api.client.gui.icon.Icon; @@ -36,16 +38,33 @@ public class TagPreviewWidget extends HorizontalListWidget { public void initialize(Parent parent) { super.initialize(parent); - TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> Laby.labyAPI().minecraft().executeOnRenderThread(() -> { - if(info == null) { - System.out.println("Info is null"); - return; - } - ComponentWidget tag = ComponentWidget.component(info.getTag() != null ? info.getTag() : Component.empty()).addId("tag"); - if(!info.getIconName().equals("NONE")) this.addEntry(new IconWidget(info.getIcon()).addId("icon")); - this.addEntry(tag); - if(info.isAdmin()) this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); - })); + TagCache.resolve(Laby.labyAPI().getUniqueId(), + (info) -> Laby.labyAPI().minecraft().executeOnRenderThread(() -> { + Component error = getError(info); + if (error != null) { + ComponentWidget errorComponent = ComponentWidget.component(error) + .addId("error"); + this.addEntry(errorComponent); + return; + } + ComponentWidget tag = ComponentWidget.component( + info.getTag() != null ? info.getTag() : Component.empty()).addId("tag"); + if (!info.getIconName().equals("NONE")) + this.addEntry(new IconWidget(info.getIcon()).addId("icon")); + this.addEntry(tag); + if (info.isAdmin()) + this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); + })); + } + + private Component getError(PlayerInfo info) { + if(Util.getSessionToken() == null) return Component.translatable("globaltags.settings.tags.tagPreview.labyConnect"); + else if(info == null) return Component.translatable("globaltags.settings.tags.tagPreview.noInfo"); + else if(info.isBanned()) return Component.translatable( + "globaltags.settings.tags.tagPreview.banned", + Component.text(info.getBanReason()) + ); + return null; } @SettingFactory From 2510533bfe8d96de62424ab09721c3e840b77678 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 21:35:07 +0200 Subject: [PATCH 046/105] Fix display of overflowing error components --- .../assets/globaltags/themes/fancy/lss/preview.lss | 7 ++++++- .../assets/globaltags/themes/vanilla/lss/preview.lss | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss index cef2271..e042c4d 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss @@ -1,7 +1,12 @@ TagPreview { - height: 20; + height: fit-content; orientation: horizontal; + .error { + text-color: red; + margin-left: 2; + } + .icon { margin-left: 1; margin-right: 3; diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss index cef2271..e042c4d 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss @@ -1,7 +1,12 @@ TagPreview { - height: 20; + height: fit-content; orientation: horizontal; + .error { + text-color: red; + margin-left: 2; + } + .icon { margin-left: 1; margin-right: 3; From 4c96f8c76000dccbb173fc648db595935685f342 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Mon, 10 Jun 2024 21:35:21 +0200 Subject: [PATCH 047/105] Add error translationg --- core/src/main/resources/assets/globaltags/i18n/en_us.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index cb592e1..8ba2c76 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -21,7 +21,10 @@ "tags": { "name": "Tag settings", "tagPreview": { - "name": "Tag Preview" + "name": "Tag Preview", + "banned": "Your account is suspended!\nReason: %s", + "noInfo": "Couldn't fetch account info!", + "labyConnect": "You're not connected to LabyConnect!" }, "tag": { "name": "Global tag" From 0f4a3710607d73a4228d0e04b35c6c8ec840c445 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:03:37 +0200 Subject: [PATCH 048/105] Remove wrong notification in ApiHandler --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 36fab38..9cf15f0 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -131,7 +131,6 @@ public Map getBody() { request.sendAsyncRequest((response) -> { if(!request.isSuccessful()) { consumer.accept(new ApiResponse(false, request.getError())); - Util.notify(I18n.translate("globaltags.notifications.error"), request.getError()); return; } consumer.accept(new ApiResponse(true, request.getMessage())); From 6a9769237d373d1cb62d0e4e2f43b221dcb593e9 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:04:51 +0200 Subject: [PATCH 049/105] Add config change listeners, add getters for config properties --- .../config/subconfig/TagSubConfig.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 93cfae9..115ddc0 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -14,11 +14,22 @@ import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.property.ConfigProperty; import net.labymod.api.configuration.settings.Setting; +import net.labymod.api.util.Debounce; import net.labymod.api.util.I18n; import net.labymod.api.util.MethodOrder; public class TagSubConfig extends Config { + public TagSubConfig() { + Runnable runnable = () -> Debounce.of("globaltags-config-update", 2000, () -> Util.notify( + I18n.translate("globaltags.settings.tags.staged.title"), + I18n.translate("globaltags.settings.tags.staged.description") + )); + tag.addChangeListener(runnable); + position.addChangeListener(runnable); + globalIcon.addChangeListener(runnable); + } + public void fetchTag() { TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> tag.set(info.getPlainTag() != null ? info.getPlainTag() : "")); } @@ -65,4 +76,15 @@ public void clearCache(Setting setting) { I18n.translate("globaltags.notifications.cacheCleared") ); } + + public ConfigProperty tag() { + return tag; + } + public ConfigProperty position() { + return position; + } + + public ConfigProperty icon() { + return globalIcon; + } } From 6ac11b0c4da325324f360cc47502dd93c3340642 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:05:18 +0200 Subject: [PATCH 050/105] Initialize TagPreviewWidget with settings element, add refresh button --- .../com/rappytv/globaltags/util/TagCache.java | 3 ++ .../config/widget/TagPreviewWidget.java | 41 ++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java index dc60004..c12da67 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -19,6 +19,9 @@ private TagCache() {} public static void add(UUID uuid, PlayerInfo info) { cache.put(uuid, info); } + public static void remove(UUID uuid) { + cache.remove(uuid); + } public static boolean has(UUID uuid) { return cache.containsKey(uuid); } diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index ee82f08..5723ce1 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -1,15 +1,19 @@ package com.rappytv.globaltags.config.widget; +import com.rappytv.globaltags.config.subconfig.TagSubConfig; +import com.rappytv.globaltags.types.GlobalIcon; import com.rappytv.globaltags.types.PlayerInfo; import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; +import net.labymod.api.Textures.SpriteCommon; import net.labymod.api.client.component.Component; import net.labymod.api.client.gui.icon.Icon; import net.labymod.api.client.gui.lss.property.annotation.AutoWidget; import net.labymod.api.client.gui.screen.Parent; import net.labymod.api.client.gui.screen.activity.Link; import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; import net.labymod.api.client.resources.ResourceLocation; @@ -33,6 +37,11 @@ public class TagPreviewWidget extends HorizontalListWidget { "globaltags", "textures/icons/staff.png" )); + private final TagSubConfig config; + + private TagPreviewWidget(TagSubConfig config) { + this.config = config; + } @Override public void initialize(Parent parent) { @@ -45,20 +54,32 @@ public void initialize(Parent parent) { ComponentWidget errorComponent = ComponentWidget.component(error) .addId("error"); this.addEntry(errorComponent); - return; + } else { + config.tag().set(info.getPlainTag()); + config.position().set(info.getPosition()); + config.icon().set(info.getIconValue()); + ComponentWidget tag = ComponentWidget.component( + info.getTag() != null ? info.getTag() : Component.text("Empty")).addId("tag"); + if (info.getIconValue() != GlobalIcon.NONE) + this.addEntry(new IconWidget(info.getIcon()).addId("icon")); + this.addEntry(tag); + if (info.isAdmin()) + this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); } - ComponentWidget tag = ComponentWidget.component( - info.getTag() != null ? info.getTag() : Component.empty()).addId("tag"); - if (!info.getIconName().equals("NONE")) - this.addEntry(new IconWidget(info.getIcon()).addId("icon")); - this.addEntry(tag); - if (info.isAdmin()) - this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); + ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, this::refetch) + .addId("refresh-button"); + addEntry(refreshButton); })); } + public void refetch() { + TagCache.remove(Laby.labyAPI().getUniqueId()); + this.reInitialize(); + } + private Component getError(PlayerInfo info) { - if(Util.getSessionToken() == null) return Component.translatable("globaltags.settings.tags.tagPreview.labyConnect"); + String session = Util.getSessionToken(); + if(session == null) return Component.translatable("globaltags.settings.tags.tagPreview.labyConnect"); else if(info == null) return Component.translatable("globaltags.settings.tags.tagPreview.noInfo"); else if(info.isBanned()) return Component.translatable( "globaltags.settings.tags.tagPreview.banned", @@ -72,7 +93,7 @@ public static class Factory implements WidgetFactory Date: Wed, 12 Jun 2024 01:06:33 +0200 Subject: [PATCH 051/105] Move PlayerInfo#getIconName -> PlayerInfo#getIconValue and return GlobalIcon --- .../java/com/rappytv/globaltags/types/PlayerInfo.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 463774e..4490101 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -55,8 +55,12 @@ public PositionType getPosition() { // To reduce object creation. Won't be cleared until restart private final Map iconCache = new HashMap<>(); - public String getIconName() { - return icon; + public GlobalIcon getIconValue() { + try { + return GlobalIcon.valueOf(icon); + } catch (Exception ignored) { + return GlobalIcon.NONE; + } } public Icon getIcon() { From 9b4aac7861609c707d4bd5d46a55cb69f0b52558 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:06:57 +0200 Subject: [PATCH 052/105] Add stage translations --- core/src/main/resources/assets/globaltags/i18n/en_us.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 8ba2c76..15a9a54 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -20,6 +20,10 @@ }, "tags": { "name": "Tag settings", + "staged": { + "title": "Staged changes.", + "description": "Click on the \"Publish settings\" button to publish changes!" + }, "tagPreview": { "name": "Tag Preview", "banned": "Your account is suspended!\nReason: %s", From c75acaf02313ac9fccee2d35ae2d89aa2c05c578 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:07:12 +0200 Subject: [PATCH 053/105] Add refresh button lss --- .../assets/globaltags/themes/fancy/lss/preview.lss | 12 ++++++++++++ .../assets/globaltags/themes/vanilla/lss/preview.lss | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss index e042c4d..b6aa6aa 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss @@ -19,4 +19,16 @@ TagPreview { height: 11; width: height; } + + .refresh-button { + height: 20; + width: height; + padding: 0; + alignment: right; + + .button-icon { + height: 8; + width: height; + } + } } \ No newline at end of file diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss index e042c4d..b6aa6aa 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss @@ -19,4 +19,16 @@ TagPreview { height: 11; width: height; } + + .refresh-button { + height: 20; + width: height; + padding: 0; + alignment: right; + + .button-icon { + height: 8; + width: height; + } + } } \ No newline at end of file From 4e8e0e2e94f2ae4d9a6d22bb797d7d6205a4e6ee Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:22:36 +0200 Subject: [PATCH 054/105] Remove unused import --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 9cf15f0..5bd78a0 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -7,7 +7,6 @@ import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; import net.labymod.api.client.entity.player.tag.PositionType; -import net.labymod.api.util.I18n; import net.labymod.api.util.io.web.request.Request.Method; import java.util.Map; import java.util.UUID; From ad3539584d5075cac280b194a6f402b0ef149ead Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 01:50:31 +0200 Subject: [PATCH 055/105] Move PlayerInfo#getIcon into GlobalIcon#getIcon --- .../rappytv/globaltags/types/GlobalIcon.java | 24 ++++++++++++++++++- .../rappytv/globaltags/types/PlayerInfo.java | 20 ++-------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java b/api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java index 863ed91..647ad09 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java +++ b/api/src/main/java/com/rappytv/globaltags/types/GlobalIcon.java @@ -1,5 +1,10 @@ package com.rappytv.globaltags.types; +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.client.resources.ResourceLocation; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public enum GlobalIcon { NONE, @@ -19,5 +24,22 @@ public enum GlobalIcon { TWITCH, X, XBOX, - YOUTUBE + YOUTUBE; + + private final Map iconCache = new HashMap<>(); + + public Icon getIcon() { + String name = name().toLowerCase(); + if(iconCache.containsKey(name)) + return iconCache.get(name); + ResourceLocation location = ResourceLocation.create( + "globaltags", + "textures/icons/" + name + ".png" + ); + iconCache.put( + name, + location.exists() ? Icon.texture(location) : null + ); + return getIcon(); + } } diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 4490101..23d88e8 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -5,9 +5,6 @@ import net.labymod.api.client.component.Component; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.gui.icon.Icon; -import net.labymod.api.client.resources.ResourceLocation; -import java.util.HashMap; -import java.util.Map; import java.util.UUID; public class PlayerInfo { @@ -52,10 +49,7 @@ public PositionType getPosition() { }; } - // To reduce object creation. Won't be cleared until restart - private final Map iconCache = new HashMap<>(); - - public GlobalIcon getIconValue() { + public GlobalIcon getGlobalIcon() { try { return GlobalIcon.valueOf(icon); } catch (Exception ignored) { @@ -64,17 +58,7 @@ public GlobalIcon getIconValue() { } public Icon getIcon() { - if(iconCache.containsKey(this.icon.toLowerCase())) - return iconCache.get(this.icon.toLowerCase()); - ResourceLocation location = ResourceLocation.create( - "globaltags", - "textures/icons/" + this.icon.toLowerCase() + ".png" - ); - iconCache.put( - this.icon.toLowerCase(), - location.exists() ? Icon.texture(location) : null - ); - return getIcon(); + return getGlobalIcon().getIcon(); } public boolean isAdmin() { From 4d028e12cb526d93a00645484b342b5e6207f93d Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 12 Jun 2024 02:09:21 +0200 Subject: [PATCH 056/105] Some confusing fetching and reloading stuff that needs to be changed immediately --- .../config/subconfig/TagSubConfig.java | 18 +++---- .../config/widget/TagPreviewWidget.java | 53 +++++++++++++++---- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 115ddc0..34390ce 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -1,11 +1,10 @@ package com.rappytv.globaltags.config.subconfig; import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.config.widget.TagPreviewWidget; import com.rappytv.globaltags.config.widget.TagPreviewWidget.TagPreviewSetting; import com.rappytv.globaltags.types.GlobalIcon; -import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; -import net.labymod.api.Laby; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget.ButtonSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget.TextFieldSetting; @@ -21,19 +20,18 @@ public class TagSubConfig extends Config { public TagSubConfig() { - Runnable runnable = () -> Debounce.of("globaltags-config-update", 2000, () -> Util.notify( - I18n.translate("globaltags.settings.tags.staged.title"), - I18n.translate("globaltags.settings.tags.staged.description") - )); + Runnable runnable = () -> Debounce.of("globaltags-config-update", 1000, () -> { + if(TagPreviewWidget.change()) + Util.notify( + I18n.translate("globaltags.settings.tags.staged.title"), + I18n.translate("globaltags.settings.tags.staged.description") + ); + }); tag.addChangeListener(runnable); position.addChangeListener(runnable); globalIcon.addChangeListener(runnable); } - public void fetchTag() { - TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> tag.set(info.getPlainTag() != null ? info.getPlainTag() : "")); - } - @TagPreviewSetting private final ConfigProperty tagPreview = new ConfigProperty<>(false); diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 5723ce1..43fb5d2 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -33,35 +33,53 @@ @SettingWidget public class TagPreviewWidget extends HorizontalListWidget { + // TODO: The fetching, reloading and the notification are not working properly with eachother + private final Icon adminIcon = Icon.texture(ResourceLocation.create( "globaltags", "textures/icons/staff.png" )); + private static boolean refetch = true; + private static boolean changed = false; private final TagSubConfig config; private TagPreviewWidget(TagSubConfig config) { this.config = config; } + @Override + public void tick() { + super.tick(); + if(changed) { + reload(); + changed = false; + } + } + @Override public void initialize(Parent parent) { super.initialize(parent); - TagCache.resolve(Laby.labyAPI().getUniqueId(), - (info) -> Laby.labyAPI().minecraft().executeOnRenderThread(() -> { + TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> + Laby.labyAPI().minecraft().executeOnRenderThread(() -> { Component error = getError(info); if (error != null) { ComponentWidget errorComponent = ComponentWidget.component(error) .addId("error"); this.addEntry(errorComponent); } else { - config.tag().set(info.getPlainTag()); - config.position().set(info.getPosition()); - config.icon().set(info.getIconValue()); + if(refetch) { + config.tag().set(info.getPlainTag()); + config.position().set(info.getPosition()); + config.icon().set(info.getGlobalIcon()); + } ComponentWidget tag = ComponentWidget.component( - info.getTag() != null ? info.getTag() : Component.text("Empty")).addId("tag"); - if (info.getIconValue() != GlobalIcon.NONE) - this.addEntry(new IconWidget(info.getIcon()).addId("icon")); + info.getTag() != null + ? Util.translateColorCodes(config.tag().get()) + : Component.text("Empty") + ).addId("tag"); + if (info.getGlobalIcon() != GlobalIcon.NONE) + this.addEntry(new IconWidget(config.icon().get().getIcon()).addId("icon")); this.addEntry(tag); if (info.isAdmin()) this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); @@ -72,8 +90,25 @@ public void initialize(Parent parent) { })); } + public void reload() { + refetch(false); + } + public void refetch() { - TagCache.remove(Laby.labyAPI().getUniqueId()); + refetch(true); + } + + public static boolean change() { + changed = true; + return !refetch; + } + + private void refetch(boolean refetch) { + TagPreviewWidget.refetch = refetch; + if(TagPreviewWidget.refetch) { + TagCache.remove(Laby.labyAPI().getUniqueId()); + TagPreviewWidget.refetch = false; + } this.reInitialize(); } From 404970ac0da26213775a4b4b3ebd8bc1b784dbb2 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Tue, 18 Jun 2024 14:34:02 +0200 Subject: [PATCH 057/105] Fix refetching and changing --- .../config/subconfig/TagSubConfig.java | 10 ++-- .../config/widget/TagPreviewWidget.java | 47 +++++++++---------- 2 files changed, 26 insertions(+), 31 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 34390ce..61714f9 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -20,13 +20,9 @@ public class TagSubConfig extends Config { public TagSubConfig() { - Runnable runnable = () -> Debounce.of("globaltags-config-update", 1000, () -> { - if(TagPreviewWidget.change()) - Util.notify( - I18n.translate("globaltags.settings.tags.staged.title"), - I18n.translate("globaltags.settings.tags.staged.description") - ); - }); + Runnable runnable = () -> Debounce.of("globaltags-config-update", 1000, + TagPreviewWidget::change + ); tag.addChangeListener(runnable); position.addChangeListener(runnable); globalIcon.addChangeListener(runnable); diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 43fb5d2..5d91ff8 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -23,6 +23,7 @@ import net.labymod.api.configuration.settings.annotation.SettingFactory; import net.labymod.api.configuration.settings.annotation.SettingWidget; import net.labymod.api.configuration.settings.widget.WidgetFactory; +import net.labymod.api.util.I18n; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -33,8 +34,6 @@ @SettingWidget public class TagPreviewWidget extends HorizontalListWidget { - // TODO: The fetching, reloading and the notification are not working properly with eachother - private final Icon adminIcon = Icon.texture(ResourceLocation.create( "globaltags", "textures/icons/staff.png" @@ -50,16 +49,21 @@ private TagPreviewWidget(TagSubConfig config) { @Override public void tick() { super.tick(); - if(changed) { - reload(); - changed = false; - } + if(!refetch && !changed) return; + if(refetch) + TagCache.remove(Laby.labyAPI().getUniqueId()); + reInitialize(); + refetch = false; + changed = false; } @Override public void initialize(Parent parent) { super.initialize(parent); + initialize(refetch); + } + public void initialize(boolean refetched) { TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> Laby.labyAPI().minecraft().executeOnRenderThread(() -> { Component error = getError(info); @@ -68,11 +72,20 @@ public void initialize(Parent parent) { .addId("error"); this.addEntry(errorComponent); } else { - if(refetch) { + if(refetched) { config.tag().set(info.getPlainTag()); config.position().set(info.getPosition()); config.icon().set(info.getGlobalIcon()); } + boolean updated = !config.tag().get().equals(info.getPlainTag()) + || !config.position().get().equals(info.getPosition()) + || !config.icon().get().equals(info.getGlobalIcon()); + if(changed && updated) { + Util.notify( + I18n.translate("globaltags.settings.tags.staged.title"), + I18n.translate("globaltags.settings.tags.staged.description") + ); + } ComponentWidget tag = ComponentWidget.component( info.getTag() != null ? Util.translateColorCodes(config.tag().get()) @@ -90,26 +103,12 @@ public void initialize(Parent parent) { })); } - public void reload() { - refetch(false); + public static void change() { + TagPreviewWidget.changed = true; } public void refetch() { - refetch(true); - } - - public static boolean change() { - changed = true; - return !refetch; - } - - private void refetch(boolean refetch) { - TagPreviewWidget.refetch = refetch; - if(TagPreviewWidget.refetch) { - TagCache.remove(Laby.labyAPI().getUniqueId()); - TagPreviewWidget.refetch = false; - } - this.reInitialize(); + refetch = true; } private Component getError(PlayerInfo info) { From ebddb0d49ad7204a687981a00f31393770d6a9f3 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Tue, 18 Jun 2024 14:42:29 +0200 Subject: [PATCH 058/105] Fix cache preview --- .../globaltags/config/widget/TagPreviewWidget.java | 8 ++++---- .../assets/globaltags/themes/fancy/lss/preview.lss | 7 +++++-- .../assets/globaltags/themes/vanilla/lss/preview.lss | 7 +++++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 5d91ff8..a27b348 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -69,7 +69,7 @@ public void initialize(boolean refetched) { Component error = getError(info); if (error != null) { ComponentWidget errorComponent = ComponentWidget.component(error) - .addId("error"); + .addId("text", "error"); this.addEntry(errorComponent); } else { if(refetched) { @@ -87,11 +87,11 @@ public void initialize(boolean refetched) { ); } ComponentWidget tag = ComponentWidget.component( - info.getTag() != null + config.tag().get() != null ? Util.translateColorCodes(config.tag().get()) : Component.text("Empty") - ).addId("tag"); - if (info.getGlobalIcon() != GlobalIcon.NONE) + ).addId("text"); + if (config.icon().get() != GlobalIcon.NONE) this.addEntry(new IconWidget(config.icon().get().getIcon()).addId("icon")); this.addEntry(tag); if (info.isAdmin()) diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss index b6aa6aa..289c9b1 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss @@ -2,14 +2,17 @@ TagPreview { height: fit-content; orientation: horizontal; + .text { + margin-left: 2; + } + .error { text-color: red; - margin-left: 2; } .icon { margin-left: 1; - margin-right: 3; + margin-right: 1; height: 16; width: height; } diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss index b6aa6aa..289c9b1 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss @@ -2,14 +2,17 @@ TagPreview { height: fit-content; orientation: horizontal; + .text { + margin-left: 2; + } + .error { text-color: red; - margin-left: 2; } .icon { margin-left: 1; - margin-right: 3; + margin-right: 1; height: 16; width: height; } From 3d8abd5655197e30c91c901cc730c18d1fb1f34e Mon Sep 17 00:00:00 2001 From: RappyTV Date: Tue, 18 Jun 2024 14:43:00 +0200 Subject: [PATCH 059/105] Format runnable --- .../com/rappytv/globaltags/config/subconfig/TagSubConfig.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 61714f9..4a01ad3 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -20,7 +20,9 @@ public class TagSubConfig extends Config { public TagSubConfig() { - Runnable runnable = () -> Debounce.of("globaltags-config-update", 1000, + Runnable runnable = () -> Debounce.of( + "globaltags-config-update", + 1000, TagPreviewWidget::change ); tag.addChangeListener(runnable); From fa12871503162c042eed5cc0e0e82c1e887d6ec2 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Tue, 18 Jun 2024 16:18:45 +0200 Subject: [PATCH 060/105] Fix how empty tags are displayed --- .../com/rappytv/globaltags/types/PlayerInfo.java | 7 ++++++- .../java/com/rappytv/globaltags/util/Util.java | 4 +++- .../config/widget/TagPreviewWidget.java | 16 ++++++++++++---- .../resources/assets/globaltags/i18n/en_us.json | 4 +++- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 23d88e8..b60a002 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -5,6 +5,8 @@ import net.labymod.api.client.component.Component; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.gui.icon.Icon; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.UUID; public class PlayerInfo { @@ -20,7 +22,7 @@ public class PlayerInfo { public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean admin, Ban ban) { this.uuid = uuid; this.tag = Util.translateColorCodes(tag); - this.plainTag = tag; + this.plainTag = tag != null ? tag : ""; this.position = position; this.icon = icon; this.admin = admin; @@ -31,10 +33,12 @@ public UUID getUUID() { return uuid; } + @NotNull public Component getTag() { return tag; } + @NotNull public String getPlainTag() { return plainTag; } @@ -69,6 +73,7 @@ public boolean isBanned() { return ban != null && ban.active; } + @Nullable public String getBanReason() { if(ban == null) return null; return ban.reason; diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index 78a809d..df7d7d4 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -8,6 +8,7 @@ import net.labymod.api.labyconnect.TokenStorage.Token; import net.labymod.api.notification.Notification; import net.labymod.api.notification.Notification.Type; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class Util { @@ -20,8 +21,9 @@ public static void notify(String title, String text) { .buildAndPush(); } + @NotNull public static Component translateColorCodes(String string) { - if(string == null) return null; + if(string == null) string = ""; return LegacyComponentSerializer .legacyAmpersand() .deserialize(string); diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index a27b348..c3525ca 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -8,6 +8,7 @@ import net.labymod.api.Laby; import net.labymod.api.Textures.SpriteCommon; import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; import net.labymod.api.client.gui.icon.Icon; import net.labymod.api.client.gui.lss.property.annotation.AutoWidget; import net.labymod.api.client.gui.screen.Parent; @@ -87,9 +88,12 @@ public void initialize(boolean refetched) { ); } ComponentWidget tag = ComponentWidget.component( - config.tag().get() != null - ? Util.translateColorCodes(config.tag().get()) - : Component.text("Empty") + config.tag().get().isBlank() + ? Component.translatable( + "globaltags.settings.tags.tagPreview.empty", + NamedTextColor.RED + ) + : Util.translateColorCodes(config.tag().get()) ).addId("text"); if (config.icon().get() != GlobalIcon.NONE) this.addEntry(new IconWidget(config.icon().get().getIcon()).addId("icon")); @@ -117,7 +121,11 @@ private Component getError(PlayerInfo info) { else if(info == null) return Component.translatable("globaltags.settings.tags.tagPreview.noInfo"); else if(info.isBanned()) return Component.translatable( "globaltags.settings.tags.tagPreview.banned", - Component.text(info.getBanReason()) + Component.text( + info.getBanReason() != null + ? info.getBanReason() + : I18n.translate("globaltags.settings.tags.tagPreview.emptyReason") + ) ); return null; } diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 15a9a54..c00f3e2 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -28,7 +28,9 @@ "name": "Tag Preview", "banned": "Your account is suspended!\nReason: %s", "noInfo": "Couldn't fetch account info!", - "labyConnect": "You're not connected to LabyConnect!" + "labyConnect": "You're not connected to LabyConnect!", + "empty": "", + "emptyReason": "No reason provided" }, "tag": { "name": "Global tag" From 3dc34c3e39ed06fe83e098d6effb8c1ebe3b8bd0 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 13:18:24 +0200 Subject: [PATCH 061/105] Fix ApiHandler#setPosition response success boolean --- api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 5bd78a0..5f3b699 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -107,7 +107,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(false, request.getMessage())); + consumer.accept(new ApiResponse(true, request.getMessage())); Util.clearCache(); }); } From b6d03a96ae90430087ff54b96f60e5f54c21c895 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 13:48:33 +0200 Subject: [PATCH 062/105] Add popup when updating tag settings --- .../com/rappytv/globaltags/util/Util.java | 43 +++++++++++++++++++ .../config/subconfig/TagSubConfig.java | 26 +++++++++-- .../assets/globaltags/i18n/en_us.json | 4 +- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index df7d7d4..d6703a9 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -2,7 +2,9 @@ import net.labymod.api.Laby; import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; import net.labymod.api.client.component.serializer.legacy.LegacyComponentSerializer; +import net.labymod.api.client.gui.screen.widget.widgets.popup.SimpleAdvancedPopup; import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.TokenStorage.Purpose; import net.labymod.api.labyconnect.TokenStorage.Token; @@ -13,6 +15,14 @@ public class Util { + public static final Component unchanged = Component.translatable( + "globaltags.settings.tags.updateSettings.unchanged", + NamedTextColor.DARK_GRAY + ); + private static Component tagResponse = null; + private static Component positionResponse = null; + private static Component iconResponse = null; + public static void notify(String title, String text) { Notification.builder() .title(net.labymod.api.client.component.Component.text(title)) @@ -21,6 +31,39 @@ public static void notify(String title, String text) { .buildAndPush(); } + public static void update(ResultType type, Component component) { + switch (type) { + case TAG -> tagResponse = component; + case POSITION -> positionResponse = component; + case ICON -> iconResponse = component; + } + if(tagResponse == null || positionResponse == null || iconResponse == null) return; + SimpleAdvancedPopup popup = SimpleAdvancedPopup + .builder() + .title(Component.text("Update result", NamedTextColor.AQUA)) + .description(Component.translatable( + "globaltags.settings.tags.updateSettings.result", + tagResponse, + positionResponse, + iconResponse + )) + .build(); + + Laby.labyAPI().minecraft().executeOnRenderThread(() -> { + popup.displayInOverlay(); + Util.clearCache(); + tagResponse = null; + positionResponse = null; + iconResponse = null; + }); + } + + public enum ResultType { + TAG, + POSITION, + ICON + } + @NotNull public static Component translateColorCodes(String string) { if(string == null) string = ""; diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 4a01ad3..66a2ae5 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -4,7 +4,12 @@ import com.rappytv.globaltags.config.widget.TagPreviewWidget; import com.rappytv.globaltags.config.widget.TagPreviewWidget.TagPreviewSetting; import com.rappytv.globaltags.types.GlobalIcon; +import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; +import com.rappytv.globaltags.util.Util.ResultType; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget.ButtonSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget.TextFieldSetting; @@ -49,10 +54,23 @@ public TagSubConfig() { @ButtonSetting @SpriteSlot(size = 32, y = 1, x = 1) public void updateSettings(Setting setting) { - ApiHandler.setTag(tag.get(), (info) -> {}); - ApiHandler.setPosition(position.get(), (info) -> {}); - ApiHandler.setIcon(globalIcon.get(), (info) -> {}); - Util.clearCache(); + TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> { + if(!info.getPlainTag().equals(tag.get())) ApiHandler.setTag(tag.get(), (response) -> { + if(response.isSuccessful()) Util.update(ResultType.TAG, Component.text("✔", NamedTextColor.GREEN)); + else Util.update(ResultType.TAG, response.getMessage()); + }); + else Util.update(ResultType.TAG, Util.unchanged); + if(!info.getPosition().equals(position.get())) ApiHandler.setPosition(position.get(), (response) -> { + if(response.isSuccessful()) Util.update(ResultType.POSITION, Component.text("✔", NamedTextColor.GREEN)); + else Util.update(ResultType.POSITION, response.getMessage()); + }); + else Util.update(ResultType.POSITION, Util.unchanged); + if(!info.getGlobalIcon().equals(globalIcon.get())) ApiHandler.setIcon(globalIcon.get(), (response) -> { + if(response.isSuccessful()) Util.update(ResultType.ICON, Component.text("✔", NamedTextColor.GREEN)); + else Util.update(ResultType.ICON, response.getMessage()); + }); + else Util.update(ResultType.ICON, Util.unchanged); + }); } @MethodOrder(after = "updateSettings") diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index c00f3e2..0794626 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -71,7 +71,9 @@ }, "updateSettings": { "name": "Publish settings", - "text": "Click" + "text": "Update", + "result": "Tag: %s\nPosition: %s\nIcon: %s", + "unchanged": "Unchanged" }, "resetTag": { "name": "Delete global tag", From 3639da3e1fd1cebb6d5ddca1fe84d579c48daed8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 14:15:22 +0200 Subject: [PATCH 063/105] Rearrange config a bit, add IntroducedIn badge to preview widget --- .../rappytv/globaltags/GlobalTagAddon.java | 1 + .../globaltags/config/GlobalTagConfig.java | 32 +++++++++++++++---- .../config/subconfig/TagSubConfig.java | 15 ++------- .../assets/globaltags/i18n/en_us.json | 28 ++++++++++------ 4 files changed, 47 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 80b72fe..1f1e488 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -37,6 +37,7 @@ protected void preConfigurationLoad() { Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.0"), "2023-11-24")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.7"), "2024-02-27")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.9"), "2024-06-01")); + Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.2.0"), "2024-06-19")); addon = this; } diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 3f776a8..5b6b734 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -2,7 +2,9 @@ import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.config.subconfig.TagSubConfig; +import com.rappytv.globaltags.util.Util; import net.labymod.api.addon.AddonConfig; +import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget.ButtonSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SwitchWidget.SwitchSetting; import net.labymod.api.configuration.loader.annotation.ConfigName; @@ -10,6 +12,10 @@ import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.annotation.SpriteTexture; import net.labymod.api.configuration.loader.property.ConfigProperty; +import net.labymod.api.configuration.settings.Setting; +import net.labymod.api.configuration.settings.annotation.SettingSection; +import net.labymod.api.util.I18n; +import net.labymod.api.util.MethodOrder; @ConfigName("settings") @SpriteTexture("settings") @@ -24,6 +30,12 @@ public GlobalTagConfig() { @SwitchSetting @SpriteSlot(size = 32) private final ConfigProperty enabled = new ConfigProperty<>(true); + @IntroducedIn(namespace = "globaltags", value = "1.1.9") + @SpriteSlot(size = 32, y = 2, x = 2) + @SwitchSetting + private final ConfigProperty localizedResponses = new ConfigProperty<>(true); + + @SettingSection("display") @SwitchSetting @SpriteSlot(size = 32, x = 1) private final ConfigProperty showOwnTag = new ConfigProperty<>(false); @@ -34,13 +46,22 @@ public GlobalTagConfig() { @SpriteSlot(size = 32, y = 2, x = 1) @SwitchSetting private final ConfigProperty showBackground = new ConfigProperty<>(false); - @IntroducedIn(namespace = "globaltags", value = "1.1.9") - @SpriteSlot(size = 32, y = 2, x = 2) - @SwitchSetting - private final ConfigProperty localizedResponses = new ConfigProperty<>(true); + + @SettingSection("tags") @SpriteSlot(size = 32, x = 1) private final TagSubConfig tags = new TagSubConfig(); + @MethodOrder(after = "tags") + @ButtonSetting + @SpriteSlot(size = 32, y = 2) + public void clearCache(Setting setting) { + Util.clearCache(); + Util.notify( + I18n.translate("globaltags.notifications.success"), + I18n.translate("globaltags.notifications.cacheCleared") + ); + } + @Override public ConfigProperty enabled() { return enabled; @@ -54,7 +75,4 @@ public ConfigProperty tagSize() { public ConfigProperty showBackground() { return showBackground; } - public TagSubConfig tagSubConfig() { - return tags; - } } diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 66a2ae5..bb8d02f 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -15,11 +15,11 @@ import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget.TextFieldSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.dropdown.DropdownWidget.DropdownSetting; import net.labymod.api.configuration.loader.Config; +import net.labymod.api.configuration.loader.annotation.IntroducedIn; import net.labymod.api.configuration.loader.annotation.SpriteSlot; import net.labymod.api.configuration.loader.property.ConfigProperty; import net.labymod.api.configuration.settings.Setting; import net.labymod.api.util.Debounce; -import net.labymod.api.util.I18n; import net.labymod.api.util.MethodOrder; public class TagSubConfig extends Config { @@ -35,6 +35,8 @@ public TagSubConfig() { globalIcon.addChangeListener(runnable); } + @SpriteSlot(size = 32, x = 1) + @IntroducedIn(namespace = "globaltags", value = "1.2.0") @TagPreviewSetting private final ConfigProperty tagPreview = new ConfigProperty<>(false); @@ -80,17 +82,6 @@ public void resetTag(Setting setting) { ApiHandler.resetTag((info) -> {}); } - @MethodOrder(after = "resetTag") - @ButtonSetting - @SpriteSlot(size = 32, y = 2) - public void clearCache(Setting setting) { - Util.clearCache(); - Util.notify( - I18n.translate("globaltags.notifications.success"), - I18n.translate("globaltags.notifications.cacheCleared") - ); - } - public ConfigProperty tag() { return tag; } diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 0794626..8b42036 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -2,9 +2,21 @@ "globaltags": { "settings": { "name": "Global Tags", + "header": { + "display": { + "name": "Display settings" + }, + "tags": { + "name": "Tag settings" + } + }, "enabled": { "name": "Enabled" }, + "localizedResponses": { + "name": "Localize API responses", + "description": "If this option is enabled, the addon also sends your minecraft language to the API. If the translations exist, you will receive localized responses. Your minecraft language will not be stored anywhere." + }, "showOwnTag": { "name": "Show own tag" }, @@ -14,10 +26,6 @@ "showBackground": { "name": "Show background" }, - "localizedResponses": { - "name": "Localize API responses", - "description": "If this option is enabled, the addon also sends your minecraft language to the API. If the translations exist, you will receive localized responses. Your minecraft language will not be stored anywhere." - }, "tags": { "name": "Tag settings", "staged": { @@ -46,7 +54,7 @@ } }, "globalIcon": { - "name": "Global Icon", + "name": "Global icon", "entries": { "none": "None", "discord": "Discord", @@ -78,12 +86,12 @@ "resetTag": { "name": "Delete global tag", "text": "Delete" - }, - "clearCache": { - "name": "Clear cache", - "text": "Clear", - "description": "Clears the tag-cache manually.\nThe cache get's cleared automatically every §b5 minutes§f." } + }, + "clearCache": { + "name": "Clear cache", + "text": "Clear", + "description": "Clears the tag-cache manually.\nThe cache get's cleared automatically every §b5 minutes§f.\nYou can additionally clear the cache with §b/gt cc§f." } }, "notifications": { From 9a5c6335aa16cd55bbaa86e3e89d0badd628063e Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 14:22:22 +0200 Subject: [PATCH 064/105] Improve background option icon --- .../themes/vanilla/textures/settings.png | Bin 18306 -> 18544 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/textures/settings.png b/core/src/main/resources/assets/globaltags/themes/vanilla/textures/settings.png index 7eb6afc6e61cf671134e3af4c370e74ca2e4416a..cd0d6ce236abd691c27e10a4950abb539eabd80f 100644 GIT binary patch delta 14433 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 z zFbBOKT)TO^u}4nS6q-fAki*8u(G6%+(+W?46z+8ia?^fMg=o31;Jiw2YPs{bUx`{7 zB4SkZwP({ufzuKkiTBBS{*A*H#*?bKgXtW-KBySR=~^3wZr9=u2YDW)=3zTuO z9<&L)UVY(}f-@W{GXpD7QqW1^tU{jAL2j0hd#ejbUq5m0T=Eo+79$86AU*5^JxJDs zdx)=<5>XR_1o{RDlVqeG8R;mj#Qd$_OMN`QD)ov6tazvv2@!X_Hz7U~RvJrMHG$=h zG(VEHuu()W4kkG`a{z|z9DptMDiDoz|7|tM+Y@#*>-lUec(~<60tks$-aJexyHtJl zAt%8o>W)r^@)4#mQOyvtMG99R#pr@FO{qs zdo2pkzrS>Z`278k1h90=r?`pqfoT46MVX4lAje!f(9((T;|H>0Y$>P&@D18t_d~=1@gXjjjn>^|5h6mZqBUy|~6DozLbE zQqa0$r2^yegV&tobV_E*@CrbtcRwrfRIBqQp(;Z1N30aOTu|aoXR9W3a&QODBuft? zxcdAY$@Q%~IB83@K>;pK7AeuP5o4GU8LO@`BIuu^aex{*k=It-T{{21JG?8^8`!nt zxv(@i0g{uQAxdGixzl&>f^0+z^SSzLdMK2##|IC8 z#TZyW2cZY}d%F|k2ua7-ToCzTlj>-k*%Z+{C^S9sey`neqNK%wWbw{)Bs48=ll?@& zzZ#$lOKh|NEd{nqVDwE(hdVS9vP*Y}LT;qx>>Sz`(Rjf!6ykm~2;lYeB}uJCHRh-OU zrlVykiqT{-)}Rz$PjCcrL4lfMzu(qQ9?-3ieeE~?KoAzht6cdDa*wz!6bn5_Cdx=! zi?*=)@rD}O$3)nZ;0*L*1W+a1UC)?0H4Qs|efMUvIdvK9mp7i>olc#$7S;PRD;;(V%_PePSqZ??3!nATe6$`2V`8Z$JxEBhzc+jE&mBTf%93ZA6e* zo4BCPS15-k8;}#W#@`V749c#vznTqSs`DQgqdj5v0z~toBpxVWryM=D($=&Zt-lm+ z7n&f14A>DUWa>?n0Tkp`t@!h1xyo1Z+);hH5mM+dHESz)A#4zK2Qz(dK^uS{Ky7H5 zgRutY9zVY$P<^Ko58AXsrwlEpneP(pdP0@*@|Q}&J1E_`U#aS(o0N>G5=XmRtKu%* zX9B4J1@lfNpuqf;Znb@8CIow$%U>_}z{j&?w^v{-#VqqtFo9xXsZLB2dsbI(G;!)V z(hGEC_o`Dvt`K^{@5pV5>nP&Z=OHkvZj!#G&lJJeq{TmIYy@{}8nBV0rMezKrF;7i`hF(27nq~&%C z3?;`?NnR@aTmB%G_>4&PXba6|)Z?Q9I*hk$=M3F_>L)riJOoZ_f3r%kOywtsD*}W| z#f{oqgvN)r31vEMy24j6u7oYJmXGb~M_unnx!jkI8=VEt&-}!uwHw_2;lh^&fy*$=H!{0Q9En1 zP($S_9v7#-NQhioWDOM%pIoY8LHDh_lp}}2bWnzLlE;-ek8feXh5NAmH;Y}HLBD%S zYm_*P2SJ)dw+oWX(9g{GG)(wz9D*3+cUbtDxH{*PgD*ZmLIvROzuLW0J_4GqsDiqQ zsvCH}wV)5WH`;Dq|C=aDw$%gIvPL_pT+T|U0W?`Or|N+cvcr_`gnUpU{}f{SQ24}A z!jWqHRWUgH6X3_B*ePc!Lei#+8#Tkz^mYX6AJKC>YyS6xYItpbPniRTqqB$7_Pzg9 zA(L+!uN~oI;^y5{U2$k{hk=ta)3^J&(*N=o+z!Ho))T$ZTm@YIHMtK0gXkRmSbw6H z@sauL`R%8;(8_4sq!NMiM1EAUIF0ICtp*vr+ePfF%j3oqk}GBY$POv}L2fLA(})*C z&l-cN^P0KUXw9Mz#)l?(pBiwWbfHP8XTw2zE8Jj9`5EyQj4+8n6CmMl7QDlBu?=0i zh((9HH^7>-v1GLpHZR^Je#bbDSyLEjo^-_gEg(-vE)S3e?Gdh?nog>dZf#N9w%@;NSFs-BI*b~yO$cs~;lG8+0}=$$`H zu1;SOgwsC<-RZhGp#tvsK}44u^ab7)ar$yQt0R{JYx*w5P9g0F_A_VSqqE-SNJ$Sa=?*`l8F~ zFg)K-rjjT+@h0Dq*t1ygsQ0;iC#Dn6uBBP&#QOy6>0ezSs@ZhqX2<_b2T@XVymduZ zRci}4i*w={xygm0@(1YDtbS4_RTWd?7meePzrHi(@BXg&+msU4=CaJALFK7}Rtt0? zUWz&~w#=BhfV=`@BTZVeNZkv?)r|SEY=fz`TcH4)I(meq>FktBo^!Psb<(j^5dXtCi3`b^GU4{9_ zas{k3^sG?+Euz7=Q}G%-*NR*W{f0sib|8#zB`=Hu@PowLk^3a)7Y<1qv76{!k*03lrZ>5FtLmhkTxFPC#lMkR@cisQTbU5;U=QN%J$RD9nR>w)?Z|67 z@Xj9&F8V(6 zhQ#Wm(Dv8Yc*sGSt~Vwe4FW>8O?cwJ$}FIVgd~}!B&0+c&Ma;VZEAc-pJQ3&&I0|rV9F%v(OjB z_fOwA9sqm+tzdpebw9Psc%1wMDNx;;kK`7z(o z$o9j#-(a`ZXb)vrV6(V14z2OI>dMzM#!WZM}Z=*~BWD_Tbr zdMePVAmCE=AA}dOi*cfos6^LF*oub^74Bt*7`EpG@I-Ue7QV1@qS%VR zJFX7KyJ1`ShF0}88h+GwSpvVeQto}!?vZ3b(}G==;Qd~^;O;iBqXKzZRt>w*NqS2P~4!lL#~7>8yH)tR8xx05u?_bw&b-N@{a zLI(8#^8JbBkEk=m@K(TnQXF+zn+w%9~x5F&XqZ-yeD;T@BK(+ z5U5o-gh8Zs+q2K!{gFOLo`fN>4JDqwngq%qd~vcC3~5G;Sx=v=A^{wQHM9qibXrr* zGJeQONSZrY$Qu?HAm_(=DDI~mSt6v!8;+3$SOl4seG?WNi=vnCgu;rv5MJJ^>C#`# z6ISXoC~jXs#?~i?H;>u!k0FyZ^5u=3#WNKFmL1(?my?4lv!PtrEcRyQ{N@p+)N*2` zcLo$YCTI`D@7M@6F@XY;=iK{yE2H~Z=yEsX*V7w%#`i47n-tSwAyc%dTvg&m+ELTz zOAGQeS1Luda}-YrD~)%9$P%F&%z`R+~ImvbWvyPK$QyG#SHqih zSz4`IesYopy{Wh?dRD?;cp9sF0Jdx*2@1ln6Dj)8O@p=nAgg@!=|&hgZ`nG1Z&+iU z@PY8NMkUMi8gRA_$z4MIFzi$a&Rt}}^%nBYYwJf=dzJgyYW;&G(tI^po#;Su7M^=x z>9JpuaUTrud~kC->a8$j9Qk!^npnK)1)s~vUGqj?uzY7dRcb>GHlB~oIE^a7qo?+! z7Km5b(OpqoV<8GY(5tdQ%T72b{s9RF1Qs5#um^iGflzd;P*<=u@8{d^s_le+0v7~- z@-cmJJ|we$+BCnn;D|X;wnwP#HdU8LI&P02%(2TjXfPN+!uZ z$>a}f!@YSnKl;kmGP6g+=HWSNs3xK4LF2xB3ONAU8**9uVt6Mz6t}vfla>G@Uqu326Ip$nM{xQv1{ znTO?p?n@ptg*m4DD@FRv(rWV4-3T1PF@xzw)3KPO(l5mAN1L&(*&pEYgKyN!gY0@5 z;H1ev`z7*xSES<2>AJHL(x2d(=M%{V2uU=#DxzQfEjG^Ep>f;DbjjP(z-`){^Br8% z+p>CrPjNQ1VZ=(%jFVc0<(1s&PaP0~5 za67MyokjEPVjhoOtqU^-TdAze#orHkKo4BT0Mr~9O>sP>hLnjH$DI87@n8URm7iS9 zqaFS}Sl$3G?mQ}Vb0@B=iJB3$f0M@-NK=$Jck#rhgz-a$tWJP6mo3utZJ+jEYG-QF ziMC$ue&)7_)}dYO#$@$|SE>qs2Z!r1OX7cOJa2Sf8YHn&jp5|20D&6X!uYb{j!X*OzOFq zgkhBr$#=T&?j1bS*K{H@NtkBe*0hmlout`{rEZ9FgZ0kgUn|SbBN{`rNhSPN>f^s> z+l1<_NDLMks*r--QiJ`%)T~6o0G0{1+W`}eUJVz-Q2*$Rsq6cM*{~&zH5Cc?fbq$b zeZLChc3Cu@_N#K#e*8MU&^nsx?BRtO`3Ckwbs-Oy;rsG~RnWoqdr3p=vz(+RClb-D zM_RW@JOyAU_r+(}b zMu8?UNLZ8O)=>G*kpX=}$#7pYrQWtFevx23s+wY(HpYi^fuKe-b_MBbXb&~#^EpPb z7xwH=_(e1g`z(1FG(B$m@N7mxapi~Q$N0A|>#p{e1U9XR?EmH{0v>kF%I}{JFmua0 zcJBEwQ$Dtdw5>dYKubW=b+ey!K!eSY^pnMkVN-nd>%OVp+(7gbwK$Pu#rnNf9qi`U zu@v4NQCc*yk!<-G*X)hIG+KPgemgTJ)CRD;l`^=tfg1!psbgT|nSYBI4YE*g{>U1q zg8}~+tB&E+PYMDeK-=O{nXm+({8n_gBKb=rd6lNVWIx2)9JhOC>M7S!Gb+|acY1R# z7sMSiKYn@9mSQ^v&Jcd8E=56J$`5D#rVRdSK0alh57h+WcagX?v~i8y`Mv7DsE}5F z{P{vOqc!A{7onB)e&7X9><*~Fvs8*m`W)u|Omy@3CcAn+KpJin-`1Yf24d3Ae?OnD z28vg%$;F%=?ewh((VIM~Y_u$AHD!?=p-_u!qtzrOP@q;2yPHG}(Y(h`>5Ev@dHE$DpJ_a{s=IS88>h+m>AWM7;_;_KdZjd>xpvTFJ-RoC9E+V!2J ztZBP?ToaHwa%IewDg4hlrp29=^2P6FemPqu{1SJ04FKqGLx!*RxaCLaD+_P#G^fG@ z(BFA8jQ3TxEtRkc2Z7!#v@rEqnyQ!!RVCsmt5hPTB77E+!$D|j8> z_}Ps^=6q<2@&Y0u`vIdB{O*EK|8=03@pGb$I2&&Av_CE4!Ltu7k%9OEK4s) z=fYr&apDWnmc%Lbi)9XJQHKqpn~NTGniWvt9_m4Qc~!t${B!4hdd5*qe;y%SMN6d$L^@XC`l-5=J_{~hTv7V}o3vsp~b<1Uqa^KmKM5J<2-;*Mo- z7Tca)T1ds+_;`W35$2Baqa?e5R(%u59Om2ny@JwGNV4i*NIb@RyE_&FTTC7*>BJTu zK;XqXcN86RrD-s}4+akg5ljZM>zH&t{tQPhUg!3&^6a^5_|bzI?RnB7X{a&T z3sYojkLwq847T;1cb`bdc__ENAzCg2CQT$C1}6tIVgkMmyj8<7aXSwVYw`k^Pxe1F zetVun1j?JX)r7Qb%d-ssD98G!JIC-h*q((_?&_oRa9)6@#;XtE8lX>oTh5^!=yJnq zX&pi+^B$`p7j!RGuq`=Rk0|lGD^cC35YlC`{d~%&C|&wqZiBf?2U-GEPcl{zEx{0x zwHRf%xgD!#pi(Src*kTi?etGlYsUNt4bBYEnJP`M6DbMj#P;K>IF<=L|*3p|T zKQl;wsD|WLT|R@8LX2{22wBASC2|{fJfZoJ3P{C;;F4)HrW^ek<&f=?{&;h3kWFv^e%%nZo2SO zE#euqwz+BSZ_fX?;iLJ&_}=;!{Htq~m7feBktfqK)y_<0Fwyu(SMOXn`=a zQ)j#}86^%G+2mK{)Nx)CX*_NXgGQ-lUH}3n`}s}Sv9_hok}ky`UitfABi7*ueg==y zkos+b=GMsMR8gVWi7d$uAy@=(}uAB>GTISbS+~fXh%do}<*06C9^pIrY#)mkU1)e|4hs*Q{N?$#m<4W zga>J9>9&lW!GrGZ)xp!I_n(CQ)=f?2b{jBXR}lt%FT;@36Q^7HGPvkt!d~x{ELxZX zu5oD0UQ^#S*4QAOO1vha!*$h4+v^OWQ zBe(mR_UXlmfnYHmo?~Fx^03bRCjS;MGHD4w++Ai*FgMJLwU z=Rw)L>w=nrc6_$QBOk{;w<8{Q8z!*-_dAc(uN?+()tNA3>PNUVD(i1#57y@RX}eS#dG#u0?CVzS>P!$~v*$?m<6_6UN7ABfv5lXGxSyow zyMtyuSu#pKS{Jt*kqJs6aX050FXVvCdz+Xr_5F>yr>DQ-hn!kqnVT2qs$f@j&UgBJgAF(Ny7gERPkO9oz>}RPKQKSe5h9Ww(h|~eNGy?#@pPZ8yq9fQWZ8C%A`^fdrO8d zhG@}elRqn+BR^ zUKHt!m6c+f91s5r*_9c`f;y+0#%OH6Y9Zk*$@;9ko4bh++1`jocm=*rm^_ZfsbYJh z-$pR?9iI{F#4xJzPg^;t>u(Z9A~s3LJ}6fpBlATL;0wA*^g=pN1m^XmNlV$qQ`yw7 z5-Ei$qkn9=!j7|;cEOMQWb702boI%o`sS4@E);^lMX;@}p!#)q0E^NUW1%4pX)-bB zU|=AL%U$DJehJNm#ZJgHAAjL%Sn`nC`5XpfA^LX?qbuuLXz8zSDMYN7*?9S;btmuA zysLQ3KlCGHdWfzHJI?<7_1qz*%|WimtS~+ zgLuC`p{`|rw^&PHCTh{5?T&5*-8hUoZ9dPqFth>SUsI5Ax*zq3Q(~mmDNwxsg@RhZ zj%!EnPaR(wlXdd_f;>q!w<&&#ia5dT(%h0 z8D;E~n#X5Y@q!s=AjwE{r9Kf*u22Rr#M7J#hP#qAl78pp=ec?B@S8>{isYK*N3Uhf zPHEoKV*_R|_*<#p);ubexgnOdzk$haeWckTrIN*L+rZ~|2*iR&h96n?D?8EcoF{dlh&%zS zx$1IBIP3)U{7-wPwxM_k>mgm6Wkjwi#X&y|_I=uJr7JFZQIlj;GI?fHb6;S0$}4*fV<;eX*) zsssDmxe8?457!+9`B&pz#1nM}^_o-tCZalbq}Y+43$u7=W#Ayp0|{6^HCmg2gM{Cl zexBQBBRgW?sqxXMJ6Um6#IZ-faxa%i2r*U2YQ#hrTw`WEFRRjcdP z)x+(Kc;FUBe#7Lwtd`}BgJE@$B=nE9^ol{e@DFPE3fg|R^*p*8*b8wtw((wsmfrU8 zseJZU?826Mw)|vBj}P!hi*qOnB!s{ZC33ZCkY1?tuf#(SjrnNVXU%iNv4l$v1K4Hh$# zdud;f;+#2g{GxrU3~A_N+Rws-W(i7cUa)kle^&~|5aLY|u?OH_PNNXDme^bdcWtzL zE5c^{Fr-Bo&#Nz;(n}MJmZ$gCu=4l9QtT>B{?>ww93xr7M#+QXFNRK)ZB__Vx@z(o z&>Q89@berypaXi%dp^s2lU%D8L2(xL^~i;lJz=~LTq0!*{JT_1YEr#YaE{G8|9O&E z6q4{&lf!z`ctAy->#5Hg@RJr%9#Lm%K{pfrWatS*OH7gXQ26N7g$C`La*3>t$K{#d8-amKvi;B#60#iFr3pS8zzKa`TB9zh)sfLFXIvmqMmLJ-Gf>2TrtM2vlP!-5@zphtuts6 z;0Q-j_@ZbDX6T1ScP)l)s;CCVb>fbR@?0?hDfi(DN=Vt*QuJQVvGUn zA_4dZb$kx3o7e_(_w&&-6P}86Y$KgLN5VawvLwf6uTEgpQ)i?#sReK2cCnu9?3C$wZAt2 zEg3bE6k?;+T~6`Xt2ZD1gimoe*Iy@V`)EQ$fEUX~g-Dm(gWIA>-AbEsG*l!d75EJ2 zYF5Kh^%i1^1$p=cDBpERXiy<7r?NmxG*nWe6&H_EkP9aZ-LkB`Zljn>eX3&|d=C^} z)jSmHa!iDf+X-46GGwYPc=K*H_yNeI-#`l+A?ZN5*jtPx{+F5c1KC8(M=7?)0)zeg ztQcWQvKW0YF;X3cC*p)+?tdq-TK;^Fo3Gt5ZCxxHnwoM>WbpOOex~}@`+9=!8w{^^ zvQ?*X246$+k{d;yVn>QWz>0WjMn!3-b@e?M+c z`vh&CRE)A3@pX^`K8taALWaLh)Cl&ZpkTgUaiE&?H*jL*+(G5w_>#{J>~IOf+tU&x*F?kb(3FO5)hgsYh9gV!>>v;neEIkY>XO7eibSptR+5R z-DMq5_4Q)ISum}Mzz1i7tsD4m?D9%sa3p!i88BRB(A7;9l{5M?_7S-_D>H>glkcM5 z1f$c5k|m(Jr!LMKoYA;xo&{6q>7wvsvbJ|n2VE)I{d~l@OkZIz3uVKQ0_;7U_dAR07*ECN^XHI!Y#rza-dBO)zxv1@P%OIxp_84 za!mUh(0tG}{e~DJACOcbQVHJlXu3qbxuMtNO2thQ%i7_3F*Kp9A7&)+B+o%r!D0T^ zTIF{wf%(JAhdAB-jjqNzTH`$3HD!5hEtGr)Cz}U3OE3uIfW1+pY5EDv^~a;@ z^rUrC(j}HXqZ_ZBa5~tYhg!qo1WKOr(ZQ^FxHdT33t5ce>rHApgg?yu?aN;p*B=cb zQ6yGZ*jJqr2f#CBj^JRjgWPl>h8Z5W62rJVx8}>RF=FQ|qq)6e*htskC!=Nuccf2f zewL+1+7&@2O3=71-^hn**q%RYER1UuaWI^usK$VtwSA;1Hcf;!pwH!fF76pEqj*@X zYBCe%CoL=fB#oNAw-Y#+#X_0|s~$G0`zQx}7_iQI11Pe_ggi@+ZMRCmESKK)qd~qk z!bPanh8Xbdck5Q{VPz}s9Ii_%(#M5q73!VI5I&-2+tk}}U*$z7Y!SrrJQ8U>P(^)A zY!8k>s8A+^)M{<%z6c^=O`4Y7eTmnMew@7XH;OLe>&@3)Wq82m9q{M8Pq)&u$R=)$ z?zW9k45)zLH+?Nk{!;9s{W1<3K{L{^hGRt9ue3A}3axm1vgr*p{{^^uG53y_m zCo(0Hg5J<$S<1#zoMH(*yDkuZd9j#G%zH^4*K<2-+UoRaz(C?rQQUG-ApA|LOH^Uh z8-Q9)0zli4A5d$;tY|0wq)eWqqO$g?nZ!;P1GGLAE4IPEM=z05 z3uJJh+(=+mN|~nzncL#{$3Lc(o{X6N$I-{8>!WQsqLQY#gL{i9+<_8TJzS%{PE#q2 zoP|7<(|M?tdUrn=9H9T(@h*_{YyW?g!T*8vxAQ-f0spt%{}2B5zZL(#Xx;yh(!hVi0{_>_!_c5!lGE|0 zJ;=u#PkE=qrp-;4{}*E9e>Zo()nf9Oz+`FP7S=5wjW Date: Wed, 19 Jun 2024 14:23:32 +0200 Subject: [PATCH 065/105] Add background option description --- core/src/main/resources/assets/globaltags/i18n/en_us.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 8b42036..8835e86 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -24,7 +24,8 @@ "name": "Tag size" }, "showBackground": { - "name": "Show background" + "name": "Show background", + "description": "When this option is enabled, you'll see the gray vanilla nametag background behind global tags." }, "tags": { "name": "Tag settings", From 0c4725b11b65e22e5f2d5599f41981c37caa5457 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 14:41:07 +0200 Subject: [PATCH 066/105] Fix ComponentWidgets being split up buggy --- .../util/SimpleAdvancedWidePopup.java | 26 +++++++++++++++++++ .../com/rappytv/globaltags/util/Util.java | 2 +- .../config/widget/TagPreviewWidget.java | 4 +++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java diff --git a/api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java b/api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java new file mode 100644 index 0000000..734d583 --- /dev/null +++ b/api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java @@ -0,0 +1,26 @@ +package com.rappytv.globaltags.util; + +import net.labymod.api.client.gui.screen.widget.Widget; +import net.labymod.api.client.gui.screen.widget.size.SizeType; +import net.labymod.api.client.gui.screen.widget.size.WidgetSide; +import net.labymod.api.client.gui.screen.widget.size.WidgetSize; +import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.popup.SimpleAdvancedPopup; + +public class SimpleAdvancedWidePopup extends SimpleAdvancedPopup { + + @Override + protected void initializeComponents(VerticalListWidget container) { + if (this.title != null) { + container.addChild(ComponentWidget.component(this.title).addId("popup-title")); + } + + if (this.description != null) { + ComponentWidget description = ComponentWidget.component(this.description) + .addId("popup-description"); + description.setSize(SizeType.MAX, WidgetSide.WIDTH, WidgetSize.fixed(500)); + container.addChild(description); + } + } +} diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index d6703a9..8e2d854 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -38,7 +38,7 @@ public static void update(ResultType type, Component component) { case ICON -> iconResponse = component; } if(tagResponse == null || positionResponse == null || iconResponse == null) return; - SimpleAdvancedPopup popup = SimpleAdvancedPopup + SimpleAdvancedPopup popup = SimpleAdvancedWidePopup .builder() .title(Component.text("Update result", NamedTextColor.AQUA)) .description(Component.translatable( diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index c3525ca..6737b85 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -13,6 +13,9 @@ import net.labymod.api.client.gui.lss.property.annotation.AutoWidget; import net.labymod.api.client.gui.screen.Parent; import net.labymod.api.client.gui.screen.activity.Link; +import net.labymod.api.client.gui.screen.widget.size.SizeType; +import net.labymod.api.client.gui.screen.widget.size.WidgetSide; +import net.labymod.api.client.gui.screen.widget.size.WidgetSize; import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; @@ -71,6 +74,7 @@ public void initialize(boolean refetched) { if (error != null) { ComponentWidget errorComponent = ComponentWidget.component(error) .addId("text", "error"); + errorComponent.setSize(SizeType.MAX, WidgetSide.WIDTH, WidgetSize.fixed(500)); this.addEntry(errorComponent); } else { if(refetched) { From 8c29d3c9371d5f931801ac2e29195e33bd0a5343 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 17:19:21 +0200 Subject: [PATCH 067/105] Some subconfig updates --- .../java/com/rappytv/globaltags/config/GlobalTagConfig.java | 2 +- core/src/main/resources/assets/globaltags/i18n/en_us.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 5b6b734..708060b 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -48,7 +48,7 @@ public GlobalTagConfig() { private final ConfigProperty showBackground = new ConfigProperty<>(false); @SettingSection("tags") - @SpriteSlot(size = 32, x = 1) + @SpriteSlot(size = 32, y = 1) private final TagSubConfig tags = new TagSubConfig(); @MethodOrder(after = "tags") diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 8835e86..b79142f 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -28,7 +28,7 @@ "description": "When this option is enabled, you'll see the gray vanilla nametag background behind global tags." }, "tags": { - "name": "Tag settings", + "name": "Global tag settings", "staged": { "title": "Staged changes.", "description": "Click on the \"Publish settings\" button to publish changes!" From 970d8a40b7202bcaeac2c9c590b5fceaa691533f Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 19 Jun 2024 19:47:08 +0200 Subject: [PATCH 068/105] Use correct api url, add method to simplify mixin access --- api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java index 69ad96b..cd5de6e 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java @@ -32,7 +32,7 @@ public ApiRequest(Method method, String path, String key) { public void sendAsyncRequest(Callback callback) { GsonRequest request = Request.ofGson(JsonObject.class) - .url("http://localhost:5000" + path) + .url(getApiBase() + path) .method(method) .addHeader("Content-Type", "application/json") .addHeader("Authorization", key != null ? key : "") @@ -90,4 +90,7 @@ public static void addonVersion(String value) { public static String getVersion() { return version; } + private String getApiBase() { + return "https://gt.rappytv.com"; + } } From 9939b5a07bb18084e68fe7c178c95f6524d3c513 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Thu, 20 Jun 2024 17:04:45 +0200 Subject: [PATCH 069/105] Bump version --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5b0a50e..08daa72 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,7 @@ labyMod { author = "RappyTV" description = "Get yourself a custom Globaltag that's publicly visible to anyone using this addon." minecraftVersion = "*" - version = System.getenv().getOrDefault("VERSION", "1.2.0") + version = System.getenv().getOrDefault("VERSION", "1.2.0-rc1") } minecraft { From 4e6e5851cae8d7368d986a36da61c1d2a56e37e8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 00:14:52 +0200 Subject: [PATCH 070/105] Add appeal button to TagPreviewWidget --- .../globaltags/config/widget/TagPreviewWidget.java | 13 +++++++++++++ .../resources/assets/globaltags/i18n/en_us.json | 6 +++++- .../assets/globaltags/themes/fancy/lss/preview.lss | 7 +++++++ .../globaltags/themes/vanilla/lss/preview.lss | 7 +++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 6737b85..9209f80 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -108,6 +108,19 @@ public void initialize(boolean refetched) { ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, this::refetch) .addId("refresh-button"); addEntry(refreshButton); + if(info.isBanned()) { + // TODO: Implement appeal functionality + ButtonWidget appealButton = ButtonWidget.i18n( + "globaltags.settings.tags.tagPreview.appeal.name", + () -> {} + ).addId("appeal-button"); + appealButton.setHoverComponent(Component.translatable( + "globaltags.settings.tags.tagPreview.appeal.description", + NamedTextColor.GOLD + )); + appealButton.setEnabled(false); // TODO: Remove this when functionality is implemented + addEntry(appealButton); + } })); } diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index b79142f..fe17c20 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -39,7 +39,11 @@ "noInfo": "Couldn't fetch account info!", "labyConnect": "You're not connected to LabyConnect!", "empty": "", - "emptyReason": "No reason provided" + "emptyReason": "No reason provided", + "appeal": { + "name": "Appeal", + "description": "⚠ This button will only be clickable if your suspension is appealable." + } }, "tag": { "name": "Global tag" diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss index 289c9b1..183000c 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/preview.lss @@ -23,6 +23,13 @@ TagPreview { width: height; } + .appeal-button { + height: 20; + width: fit-content; + # padding: 0; + alignment: right; + } + .refresh-button { height: 20; width: height; diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss index 289c9b1..183000c 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/preview.lss @@ -23,6 +23,13 @@ TagPreview { width: height; } + .appeal-button { + height: 20; + width: fit-content; + # padding: 0; + alignment: right; + } + .refresh-button { height: 20; width: height; From 6070120bc850a1602b0cb8fd9e2ae02e3163bfff Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 00:25:51 +0200 Subject: [PATCH 071/105] Add javadocs to PlayerInfo, add PlayerInfo#Suspension, deprecate old methods --- .../rappytv/globaltags/api/ResponseBody.java | 1 + .../rappytv/globaltags/types/PlayerInfo.java | 108 +++++++++++++++++- 2 files changed, 104 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java index 79e9644..e2be23c 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java @@ -19,5 +19,6 @@ public class ResponseBody { public static class Ban { public boolean active; public String reason; + public boolean appealable; } } diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index b60a002..cd49957 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -17,7 +17,7 @@ public class PlayerInfo { private final String position; private final String icon; private final boolean admin; - private final Ban ban; + private final Suspension suspension; public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean admin, Ban ban) { this.uuid = uuid; @@ -26,23 +26,35 @@ public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean a this.position = position; this.icon = icon; this.admin = admin; - this.ban = ban; + this.suspension = new Suspension(ban); } + /** + * Returns the player's uuid + */ public UUID getUUID() { return uuid; } + /** + * Returns the player's GlobalTag as a colored component + */ @NotNull public Component getTag() { return tag; } + /** + * Returns the player's GlobalTag as a plain string - with color codes + */ @NotNull public String getPlainTag() { return plainTag; } + /** + * Returns the player's GlobalTag position + */ public PositionType getPosition() { if(position == null) return PositionType.ABOVE_NAME; return switch(position) { @@ -53,6 +65,9 @@ public PositionType getPosition() { }; } + /** + * Returns the {@link GlobalIcon} enum value which the player has selected + */ public GlobalIcon getGlobalIcon() { try { return GlobalIcon.valueOf(icon); @@ -61,21 +76,104 @@ public GlobalIcon getGlobalIcon() { } } + /** + * Returns the global icon of the player + */ public Icon getIcon() { return getGlobalIcon().getIcon(); } + /** + * Returns if the player is a GlobalTag admin + */ public boolean isAdmin() { return admin; } + /** + * Use {@link PlayerInfo#isSuspended()} instead + */ + @Deprecated(forRemoval = true) public boolean isBanned() { - return ban != null && ban.active; + return isSuspended(); } + /** + * Use {@link PlayerInfo#getSuspension()} instead + */ + @Deprecated(forRemoval = true) @Nullable public String getBanReason() { - if(ban == null) return null; - return ban.reason; + return suspension.reason; + } + + /** + * Shortcut to check if the player suspension is active + */ + public boolean isSuspended() { + return suspension.active; + } + + /** + * Gets the suspension object from a player + */ + public Suspension getSuspension() { + return suspension; + } + + public static class Suspension { + + private final boolean active; + private final String reason; + private final boolean appealable; + + /** + * Creates a suspension from a {@link Ban} object + */ + protected Suspension(Ban ban) { + this.active = ban.active; + this.reason = ban.reason; + this.appealable = ban.appealable; + } + + /** + * Creates an inactive suspension + */ + protected Suspension() { + this.active = false; + this.reason = null; + this.appealable = false; + } + + /** + * Creates an active suspension + */ + protected Suspension(String reason, boolean appealable) { + this.active = true; + this.reason = reason; + this.appealable = appealable; + } + + /** + * Returns if the suspension is active or not + */ + public boolean isActive() { + return active; + } + + /** + * Returns the suspension reason + */ + @Nullable + public String getReason() { + return reason; + } + + /** + * Returns if the suspension can be appealed + */ + public boolean isAppealable() { + return appealable; + } } } From 250f871ff359217575dec6d1d6e81361e9cc0bab Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 00:29:01 +0200 Subject: [PATCH 072/105] Make PlayerInfo#getTag nullable --- .../main/java/com/rappytv/globaltags/types/PlayerInfo.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index cd49957..49fe2db 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -39,9 +39,9 @@ public UUID getUUID() { /** * Returns the player's GlobalTag as a colored component */ - @NotNull + @Nullable public Component getTag() { - return tag; + return !plainTag.isEmpty() ? tag : null; } /** From bf89335e9a462e3c88c6c6d6ea6e1988c54df22d Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 00:30:28 +0200 Subject: [PATCH 073/105] Refrain from using deprecated methods --- .../globaltags/config/widget/TagPreviewWidget.java | 10 +++++----- .../globaltags/interaction/ToggleBanBulletPoint.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 9209f80..c0e3752 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -108,7 +108,7 @@ public void initialize(boolean refetched) { ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, this::refetch) .addId("refresh-button"); addEntry(refreshButton); - if(info.isBanned()) { + if(info.isSuspended()) { // TODO: Implement appeal functionality ButtonWidget appealButton = ButtonWidget.i18n( "globaltags.settings.tags.tagPreview.appeal.name", @@ -118,7 +118,7 @@ public void initialize(boolean refetched) { "globaltags.settings.tags.tagPreview.appeal.description", NamedTextColor.GOLD )); - appealButton.setEnabled(false); // TODO: Remove this when functionality is implemented + appealButton.setEnabled(info.getSuspension().isAppealable()); addEntry(appealButton); } })); @@ -136,11 +136,11 @@ private Component getError(PlayerInfo info) { String session = Util.getSessionToken(); if(session == null) return Component.translatable("globaltags.settings.tags.tagPreview.labyConnect"); else if(info == null) return Component.translatable("globaltags.settings.tags.tagPreview.noInfo"); - else if(info.isBanned()) return Component.translatable( + else if(info.isSuspended()) return Component.translatable( "globaltags.settings.tags.tagPreview.banned", Component.text( - info.getBanReason() != null - ? info.getBanReason() + info.getSuspension().getReason() != null + ? info.getSuspension().getReason() : I18n.translate("globaltags.settings.tags.tagPreview.emptyReason") ) ); diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java index 26a9a09..61e5ed4 100644 --- a/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java +++ b/core/src/main/java/com/rappytv/globaltags/interaction/ToggleBanBulletPoint.java @@ -17,7 +17,7 @@ public class ToggleBanBulletPoint implements BulletPoint { @Override public Component getTitle() { - return Component.translatable("globaltags.context." + (target.isBanned() ? "unban" : "ban") + ".name"); + return Component.translatable("globaltags.context." + (target.isSuspended() ? "unban" : "ban") + ".name"); } @Override @@ -27,7 +27,7 @@ public Icon getIcon() { @Override public void execute(Player player) { - if(target.isBanned()) { + if(target.isSuspended()) { ApiHandler.unbanPlayer(target.getUUID(), (response) -> Laby.references().chatExecutor().displayClientMessage( Component.empty() .append(GlobalTagAddon.prefix) From 4126ff435591672f742fd0845d2d6c3deae260c8 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 00:40:09 +0200 Subject: [PATCH 074/105] Allow null value as "appealable" (temporary), make constructors public --- .../java/com/rappytv/globaltags/api/ResponseBody.java | 2 +- .../java/com/rappytv/globaltags/types/PlayerInfo.java | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java index e2be23c..789a31d 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java @@ -19,6 +19,6 @@ public class ResponseBody { public static class Ban { public boolean active; public String reason; - public boolean appealable; + public Boolean appealable; } } diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 49fe2db..0932d77 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -121,6 +121,7 @@ public Suspension getSuspension() { return suspension; } + @SuppressWarnings("unused") public static class Suspension { private final boolean active; @@ -130,16 +131,16 @@ public static class Suspension { /** * Creates a suspension from a {@link Ban} object */ - protected Suspension(Ban ban) { + public Suspension(Ban ban) { this.active = ban.active; this.reason = ban.reason; - this.appealable = ban.appealable; + this.appealable = ban.appealable == null || ban.appealable; } /** * Creates an inactive suspension */ - protected Suspension() { + public Suspension() { this.active = false; this.reason = null; this.appealable = false; @@ -148,7 +149,7 @@ protected Suspension() { /** * Creates an active suspension */ - protected Suspension(String reason, boolean appealable) { + public Suspension(String reason, boolean appealable) { this.active = true; this.reason = reason; this.appealable = appealable; From e4602dc02a2eaaedc299e5901e9ec1d77d9aa7ff Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 00:40:28 +0200 Subject: [PATCH 075/105] Check if info is null, add notification --- .../rappytv/globaltags/config/widget/TagPreviewWidget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index c0e3752..d9a510d 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -108,11 +108,11 @@ public void initialize(boolean refetched) { ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, this::refetch) .addId("refresh-button"); addEntry(refreshButton); - if(info.isSuspended()) { + if(info != null && info.isSuspended()) { // TODO: Implement appeal functionality ButtonWidget appealButton = ButtonWidget.i18n( "globaltags.settings.tags.tagPreview.appeal.name", - () -> {} + () -> Util.notify("Not implemented", "Wait for next release candidate") ).addId("appeal-button"); appealButton.setHoverComponent(Component.translatable( "globaltags.settings.tags.tagPreview.appeal.description", From 48dceadba160fb8e44d8b60d24485492b372305c Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 13:17:16 +0200 Subject: [PATCH 076/105] Move Util#clearCache into TagCache and add consumer which accepts the new resolved PlayerInfo of the client player --- .../rappytv/globaltags/api/ApiHandler.java | 22 +++++++------------ .../com/rappytv/globaltags/util/TagCache.java | 5 +++++ .../com/rappytv/globaltags/util/Util.java | 18 ++++++++------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 5f3b699..cf1d532 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -2,6 +2,7 @@ import com.rappytv.globaltags.types.GlobalIcon; import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; @@ -82,8 +83,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); })); } @@ -107,8 +107,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -132,8 +131,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -158,8 +156,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -199,8 +196,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -221,8 +217,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -243,8 +238,7 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - consumer.accept(new ApiResponse(true, request.getMessage())); - Util.clearCache(); + TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } diff --git a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java index c12da67..88fee6f 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -2,6 +2,7 @@ import com.rappytv.globaltags.api.ApiHandler; import com.rappytv.globaltags.types.PlayerInfo; +import net.labymod.api.Laby; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -45,6 +46,10 @@ public static void resolve(UUID uuid, Consumer consumer) { }); } public static void clear() { + clear((info) -> {}); + } + public static void clear(Consumer consumer) { cache.clear(); + TagCache.resolve(Laby.labyAPI().getUniqueId(), consumer); } } diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index 8e2d854..6888bb6 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -24,9 +24,16 @@ public class Util { private static Component iconResponse = null; public static void notify(String title, String text) { + notify( + Component.text(title), + Component.text(text) + ); + } + + public static void notify(Component title, Component description) { Notification.builder() - .title(net.labymod.api.client.component.Component.text(title)) - .text(net.labymod.api.client.component.Component.text(text)) + .title(title) + .text(description) .type(Type.SOCIAL) .buildAndPush(); } @@ -51,7 +58,7 @@ public static void update(ResultType type, Component component) { Laby.labyAPI().minecraft().executeOnRenderThread(() -> { popup.displayInOverlay(); - Util.clearCache(); + TagCache.clear(); tagResponse = null; positionResponse = null; iconResponse = null; @@ -72,11 +79,6 @@ public static Component translateColorCodes(String string) { .deserialize(string); } - public static void clearCache() { - TagCache.clear(); - TagCache.resolve(Laby.labyAPI().getUniqueId()); - } - public static @Nullable String getSessionToken() { LabyConnectSession session = Laby.labyAPI().labyConnect().getSession(); if(session == null) return null; From 4cc3c981e274add4aacbd078e738894c8a07818a Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 13:18:22 +0200 Subject: [PATCH 077/105] Make TagPreviewWidget refetchable statically --- .../rappytv/globaltags/config/widget/TagPreviewWidget.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index d9a510d..0e91128 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -105,7 +105,7 @@ public void initialize(boolean refetched) { if (info.isAdmin()) this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); } - ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, this::refetch) + ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, TagPreviewWidget::refetch) .addId("refresh-button"); addEntry(refreshButton); if(info != null && info.isSuspended()) { @@ -128,7 +128,7 @@ public static void change() { TagPreviewWidget.changed = true; } - public void refetch() { + public static void refetch() { refetch = true; } From 16fca658e0bea861b8e1c1ff2ef496d96a058416 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 13:18:58 +0200 Subject: [PATCH 078/105] Readd API response when resetting the own tag via config --- .../globaltags/config/subconfig/TagSubConfig.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index bb8d02f..35476f0 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -79,7 +79,16 @@ public void updateSettings(Setting setting) { @ButtonSetting @SpriteSlot(size = 32, y = 1, x = 3) public void resetTag(Setting setting) { - ApiHandler.resetTag((info) -> {}); + ApiHandler.resetTag((info) -> { + if(info.isSuccessful()) TagPreviewWidget.refetch(); + Util.notify( + Component.translatable(info.isSuccessful() + ? "globaltags.notifications.success" + : "globaltags.notifications.error" + ), + info.getMessage().color(NamedTextColor.WHITE) + ); + }); } public ConfigProperty tag() { From cae40c24c918a2418d8e8370af7970c8df4b1760 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 13:20:33 +0200 Subject: [PATCH 079/105] Use new cache clear method --- core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java | 4 ++-- .../globaltags/command/subcommands/ClearCacheCommand.java | 4 ++-- .../java/com/rappytv/globaltags/config/GlobalTagConfig.java | 3 ++- .../rappytv/globaltags/listener/ServerNavigationListener.java | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 1f1e488..6bc0096 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -10,7 +10,7 @@ import com.rappytv.globaltags.interaction.ToggleAdminBulletPoint; import com.rappytv.globaltags.listener.ServerNavigationListener; import com.rappytv.globaltags.nametag.CustomTag; -import com.rappytv.globaltags.util.Util; +import com.rappytv.globaltags.util.TagCache; import net.labymod.api.Laby; import net.labymod.api.addon.LabyAddon; import net.labymod.api.client.component.Component; @@ -66,7 +66,7 @@ protected void enable() { new Timer().scheduleAtFixedRate(new TimerTask() { @Override public void run() { - Util.clearCache(); + TagCache.clear(); } }, 1000 * 10, 1000 * 60 * 5); } diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java index ccf19ab..525524c 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java @@ -1,7 +1,7 @@ package com.rappytv.globaltags.command.subcommands; import com.rappytv.globaltags.GlobalTagAddon; -import com.rappytv.globaltags.util.Util; +import com.rappytv.globaltags.util.TagCache; import net.labymod.api.client.chat.command.SubCommand; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; @@ -14,7 +14,7 @@ public ClearCacheCommand() { @Override public boolean execute(String prefix, String[] arguments) { - Util.clearCache(); + TagCache.clear(); displayMessage( Component.empty() .append(GlobalTagAddon.prefix) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 708060b..320cac4 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -2,6 +2,7 @@ import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.config.subconfig.TagSubConfig; +import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; import net.labymod.api.addon.AddonConfig; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget.ButtonSetting; @@ -55,7 +56,7 @@ public GlobalTagConfig() { @ButtonSetting @SpriteSlot(size = 32, y = 2) public void clearCache(Setting setting) { - Util.clearCache(); + TagCache.clear(); Util.notify( I18n.translate("globaltags.notifications.success"), I18n.translate("globaltags.notifications.cacheCleared") diff --git a/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java b/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java index 66daab8..93ebec1 100644 --- a/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java +++ b/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java @@ -1,6 +1,6 @@ package com.rappytv.globaltags.listener; -import com.rappytv.globaltags.util.Util; +import com.rappytv.globaltags.util.TagCache; import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.network.server.ServerDisconnectEvent; @@ -8,6 +8,6 @@ public class ServerNavigationListener { @Subscribe public void onLeave(ServerDisconnectEvent event) { - Util.clearCache(); + TagCache.clear(); } } From c07e0f4625f23d963053da8cc0525e1851c49666 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 13:34:59 +0200 Subject: [PATCH 080/105] Add more error handling to settings update button --- .../globaltags/config/subconfig/TagSubConfig.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index 35476f0..fe82992 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -55,8 +55,21 @@ public TagSubConfig() { @MethodOrder(after = "globalIcon") @ButtonSetting @SpriteSlot(size = 32, y = 1, x = 1) + @SuppressWarnings("ConstantConditions") public void updateSettings(Setting setting) { TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> { + Component error = null; + if(Util.getSessionToken() == null) + error = Component.translatable("globaltags.settings.tags.tagPreview.labyConnect"); + else if(info == null) + error = Component.translatable("globaltags.settings.tags.tagPreview.noInfo"); + if(error != null) { + Util.notify( + Component.translatable("globaltags.notifications.error"), + error + ); + return; + } if(!info.getPlainTag().equals(tag.get())) ApiHandler.setTag(tag.get(), (response) -> { if(response.isSuccessful()) Util.update(ResultType.TAG, Component.text("✔", NamedTextColor.GREEN)); else Util.update(ResultType.TAG, response.getMessage()); From ad369c5ecf700ee13fdb4b1057cce0013e429b5a Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 13:37:49 +0200 Subject: [PATCH 081/105] Don't instantly refetch self on cache clear, rather extract function --- .../rappytv/globaltags/api/ApiHandler.java | 21 ++++++++++++------- .../com/rappytv/globaltags/util/TagCache.java | 7 +++---- .../rappytv/globaltags/GlobalTagAddon.java | 1 + 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index cf1d532..72f81c6 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -83,7 +83,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); })); } @@ -107,7 +108,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -131,7 +133,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -156,7 +159,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -196,7 +200,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -217,7 +222,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } @@ -238,7 +244,8 @@ public Map getBody() { consumer.accept(new ApiResponse(false, request.getError())); return; } - TagCache.clear((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); }); } diff --git a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java index 88fee6f..83c1416 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -29,6 +29,9 @@ public static boolean has(UUID uuid) { public static PlayerInfo get(UUID uuid) { return cache.get(uuid); } + public static void resolveSelf(Consumer consumer) { + resolve(Laby.labyAPI().getUniqueId(), consumer); + } public static void resolve(UUID uuid) { resolve(uuid, (info) -> {}); } @@ -46,10 +49,6 @@ public static void resolve(UUID uuid, Consumer consumer) { }); } public static void clear() { - clear((info) -> {}); - } - public static void clear(Consumer consumer) { cache.clear(); - TagCache.resolve(Laby.labyAPI().getUniqueId(), consumer); } } diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 6bc0096..054a6e1 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -67,6 +67,7 @@ protected void enable() { @Override public void run() { TagCache.clear(); + TagCache.resolveSelf((info) -> {}); } }, 1000 * 10, 1000 * 60 * 5); } From 34dcb6443aafe4d82e1058f56ff8b966270e8059 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 15:30:16 +0200 Subject: [PATCH 082/105] Bump labygradle --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 9be9250..1c5ea34 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,7 +1,7 @@ rootProject.name = "GlobalTags" pluginManagement { - val labyGradlePluginVersion = "0.4.0" + val labyGradlePluginVersion = "0.4.1" plugins { id("net.labymod.gradle") version (labyGradlePluginVersion) } From fe5df02a2a869030445897df79207c79f6ec1226 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 15:30:40 +0200 Subject: [PATCH 083/105] Don't put the rc versioning into the addon jar --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 08daa72..5b0a50e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,7 @@ labyMod { author = "RappyTV" description = "Get yourself a custom Globaltag that's publicly visible to anyone using this addon." minecraftVersion = "*" - version = System.getenv().getOrDefault("VERSION", "1.2.0-rc1") + version = System.getenv().getOrDefault("VERSION", "1.2.0") } minecraft { From adc8f959eafde0dbe8bf71cc1edc527823a0eaf5 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 15:43:59 +0200 Subject: [PATCH 084/105] Appealable boolean is now implemented in the API --- api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java | 2 +- api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java index 789a31d..e2be23c 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java @@ -19,6 +19,6 @@ public class ResponseBody { public static class Ban { public boolean active; public String reason; - public Boolean appealable; + public boolean appealable; } } diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 0932d77..5670daf 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -134,7 +134,7 @@ public static class Suspension { public Suspension(Ban ban) { this.active = ban.active; this.reason = ban.reason; - this.appealable = ban.appealable == null || ban.appealable; + this.appealable = ban.appealable; } /** From 9c64c15bf406617d5054be19a6cc10819c12d648 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 16:16:36 +0200 Subject: [PATCH 085/105] Add appealBan function to ApiHandler --- .../rappytv/globaltags/api/ApiHandler.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 72f81c6..f167886 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -227,6 +227,26 @@ public Map getBody() { }); } + public static void appealBan(String reason, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + Laby.labyAPI().getUniqueId() + "/ban/appeal", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + return Map.of("reason", reason); + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); + return; + } + consumer.accept(new ApiResponse(true, request.getMessage())); + }); + } + public static void toggleAdmin(UUID uuid, Consumer consumer) { ApiRequest request = new ApiRequest( Method.POST, From 0b9368f1f91a3660e8f1885e496c1983d787a268 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 16:49:50 +0200 Subject: [PATCH 086/105] Add popup to enter appeal reason --- .../globaltags/config/widget/AppealPopup.java | 56 +++++++++++++++++++ .../config/widget/TagPreviewWidget.java | 3 +- .../assets/globaltags/i18n/en_us.json | 7 ++- 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java b/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java new file mode 100644 index 0000000..1a00007 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java @@ -0,0 +1,56 @@ +package com.rappytv.globaltags.config.widget; + +import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.util.Util; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.client.gui.screen.activity.Link; +import net.labymod.api.client.gui.screen.widget.Widget; +import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.popup.AdvancedPopup; +import org.jetbrains.annotations.Nullable; + +public class AppealPopup extends AdvancedPopup { + + @Override + public @Nullable Widget initialize() { + VerticalListWidget content = new VerticalListWidget<>().addId("content"); + ComponentWidget labelWidget = ComponentWidget.i18n( + "globaltags.settings.tags.tagPreview.appeal.popup.label" + ).addId("label", "popup-description"); + TextFieldWidget inputWidget = new TextFieldWidget() + .placeholder(Component.translatable( + "globaltags.settings.tags.tagPreview.appeal.popup.placeholder", + NamedTextColor.DARK_GRAY + )) + .addId("input", "popup-description"); + ButtonWidget sendButton = new ButtonWidget() + .updateComponent(Component.translatable( + "globaltags.settings.tags.tagPreview.appeal.popup.button", + NamedTextColor.RED + )) + .addId("send-button", "popup-description"); + sendButton.setEnabled(false); + sendButton.setActionListener(() -> { + ApiHandler.appealBan(inputWidget.getText(), (response) -> + Util.notify( + Component.translatable(response.isSuccessful() + ? "globaltags.notifications.success" + : "globaltags.notifications.error" + ), + response.getMessage().color(NamedTextColor.WHITE) + ) + ); + }); + inputWidget.updateListener((text) -> sendButton.setEnabled(!text.isBlank())); + + content.addChild(labelWidget); + content.addChild(inputWidget); + content.addChild(sendButton); + + return content; + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 0e91128..72a76ae 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -109,10 +109,9 @@ public void initialize(boolean refetched) { .addId("refresh-button"); addEntry(refreshButton); if(info != null && info.isSuspended()) { - // TODO: Implement appeal functionality ButtonWidget appealButton = ButtonWidget.i18n( "globaltags.settings.tags.tagPreview.appeal.name", - () -> Util.notify("Not implemented", "Wait for next release candidate") + () -> new AppealPopup().displayInOverlay() ).addId("appeal-button"); appealButton.setHoverComponent(Component.translatable( "globaltags.settings.tags.tagPreview.appeal.description", diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index fe17c20..e5ba243 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -42,7 +42,12 @@ "emptyReason": "No reason provided", "appeal": { "name": "Appeal", - "description": "⚠ This button will only be clickable if your suspension is appealable." + "description": "⚠ This button will only be clickable if your suspension is appealable.", + "popup": { + "label": "Why should we unban you?", + "placeholder": "Please enter a reason...", + "button": "Send appeal" + } } }, "tag": { From 923080179d8601312bd07fb805e364990ade0725 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 21 Jun 2024 16:51:17 +0200 Subject: [PATCH 087/105] Use Notification.Type#System instead of #Social so notifications are not silenced in dnd --- api/src/main/java/com/rappytv/globaltags/util/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index 6888bb6..ed11f81 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -34,7 +34,7 @@ public static void notify(Component title, Component description) { Notification.builder() .title(title) .text(description) - .type(Type.SOCIAL) + .type(Type.SYSTEM) .buildAndPush(); } From 61b8e21654991f02f84faae6d478e4105bb4108e Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 23 Jun 2024 18:08:56 +0200 Subject: [PATCH 088/105] Add button to join the discord --- .../globaltags/config/GlobalTagConfig.java | 7 +++++++ .../assets/globaltags/i18n/en_us.json | 4 ++++ .../themes/vanilla/textures/settings.png | Bin 18544 -> 20467 bytes 3 files changed, 11 insertions(+) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 320cac4..83d21db 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -4,6 +4,7 @@ import com.rappytv.globaltags.config.subconfig.TagSubConfig; import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; +import net.labymod.api.Laby; import net.labymod.api.addon.AddonConfig; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget.ButtonSetting; import net.labymod.api.client.gui.screen.widget.widgets.input.SliderWidget.SliderSetting; @@ -35,6 +36,12 @@ public GlobalTagConfig() { @SpriteSlot(size = 32, y = 2, x = 2) @SwitchSetting private final ConfigProperty localizedResponses = new ConfigProperty<>(true); + @MethodOrder(after = "localizedResponses") + @SpriteSlot(size = 32, y = 2, x = 3) + @ButtonSetting + public void joinDiscord(Setting setting) { + Laby.references().chatExecutor().openUrl("https://gt.rappytv.com/discord"); + } @SettingSection("display") @SwitchSetting diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index e5ba243..5f2501d 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -17,6 +17,10 @@ "name": "Localize API responses", "description": "If this option is enabled, the addon also sends your minecraft language to the API. If the translations exist, you will receive localized responses. Your minecraft language will not be stored anywhere." }, + "joinDiscord": { + "name": "Discord Server", + "text": "Join" + }, "showOwnTag": { "name": "Show own tag" }, diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/textures/settings.png b/core/src/main/resources/assets/globaltags/themes/vanilla/textures/settings.png index cd0d6ce236abd691c27e10a4950abb539eabd80f..e5aaf2fac8b40cc49ff5400c30983491e1fe3169 100644 GIT binary patch delta 16309 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 From 661c9267fc5b41a64595c5f61dbc95e1c0f0d111 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sun, 23 Jun 2024 19:11:21 +0200 Subject: [PATCH 089/105] Resolve self after leaving server --- .../main/java/com/rappytv/globaltags/util/TagCache.java | 3 +++ .../main/java/com/rappytv/globaltags/GlobalTagAddon.java | 2 +- .../rappytv/globaltags/config/subconfig/TagSubConfig.java | 3 +-- .../com/rappytv/globaltags/config/widget/AppealPopup.java | 7 +++---- .../rappytv/globaltags/config/widget/TagPreviewWidget.java | 2 +- .../globaltags/listener/ServerNavigationListener.java | 1 + 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java index 83c1416..6972bc9 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/TagCache.java +++ b/api/src/main/java/com/rappytv/globaltags/util/TagCache.java @@ -29,6 +29,9 @@ public static boolean has(UUID uuid) { public static PlayerInfo get(UUID uuid) { return cache.get(uuid); } + public static void resolveSelf() { + resolveSelf((info) -> {}); + } public static void resolveSelf(Consumer consumer) { resolve(Laby.labyAPI().getUniqueId(), consumer); } diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 054a6e1..f7a13f2 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -67,7 +67,7 @@ protected void enable() { @Override public void run() { TagCache.clear(); - TagCache.resolveSelf((info) -> {}); + TagCache.resolveSelf(); } }, 1000 * 10, 1000 * 60 * 5); } diff --git a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java index fe82992..3f40f6c 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/subconfig/TagSubConfig.java @@ -7,7 +7,6 @@ import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; import com.rappytv.globaltags.util.Util.ResultType; -import net.labymod.api.Laby; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; import net.labymod.api.client.entity.player.tag.PositionType; @@ -57,7 +56,7 @@ public TagSubConfig() { @SpriteSlot(size = 32, y = 1, x = 1) @SuppressWarnings("ConstantConditions") public void updateSettings(Setting setting) { - TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> { + TagCache.resolveSelf((info) -> { Component error = null; if(Util.getSessionToken() == null) error = Component.translatable("globaltags.settings.tags.tagPreview.labyConnect"); diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java b/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java index 1a00007..db99e9c 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/AppealPopup.java @@ -4,7 +4,6 @@ import com.rappytv.globaltags.util.Util; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; -import net.labymod.api.client.gui.screen.activity.Link; import net.labymod.api.client.gui.screen.widget.Widget; import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; @@ -34,7 +33,7 @@ public class AppealPopup extends AdvancedPopup { )) .addId("send-button", "popup-description"); sendButton.setEnabled(false); - sendButton.setActionListener(() -> { + sendButton.setActionListener(() -> ApiHandler.appealBan(inputWidget.getText(), (response) -> Util.notify( Component.translatable(response.isSuccessful() @@ -43,8 +42,8 @@ public class AppealPopup extends AdvancedPopup { ), response.getMessage().color(NamedTextColor.WHITE) ) - ); - }); + ) + ); inputWidget.updateListener((text) -> sendButton.setEnabled(!text.isBlank())); content.addChild(labelWidget); diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 72a76ae..fc53f97 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -68,7 +68,7 @@ public void initialize(Parent parent) { } public void initialize(boolean refetched) { - TagCache.resolve(Laby.labyAPI().getUniqueId(), (info) -> + TagCache.resolveSelf((info) -> Laby.labyAPI().minecraft().executeOnRenderThread(() -> { Component error = getError(info); if (error != null) { diff --git a/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java b/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java index 93ebec1..927c1ab 100644 --- a/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java +++ b/core/src/main/java/com/rappytv/globaltags/listener/ServerNavigationListener.java @@ -9,5 +9,6 @@ public class ServerNavigationListener { @Subscribe public void onLeave(ServerDisconnectEvent event) { TagCache.clear(); + TagCache.resolveSelf(); } } From 190f2734a18ad6cf4790b945f2d2a4e2da14a218 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 26 Jun 2024 17:14:01 +0200 Subject: [PATCH 090/105] Change type of ApiRequest body values to object --- .../rappytv/globaltags/api/ApiHandler.java | 22 +++++++++---------- .../rappytv/globaltags/api/ApiRequest.java | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index f167886..b281973 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -25,7 +25,7 @@ public static void getVersion(Consumer consumer) { null ) { @Override - public Map getBody() { + public Map getBody() { return null; } }; @@ -43,7 +43,7 @@ public static void getInfo(UUID uuid, Consumer consumer) { Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { return null; } }; @@ -74,7 +74,7 @@ public static void setTag(UUID uuid, String tag, Consumer consumer) Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { return Map.of("tag", tag); } }; @@ -99,7 +99,7 @@ public static void setPosition(UUID uuid, PositionType position, Consumer getBody() { + public Map getBody() { return Map.of("position", position.name().split("_")[0]); } }; @@ -124,7 +124,7 @@ public static void setIcon(UUID uuid, GlobalIcon icon, Consumer con Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { return Map.of("icon", icon.name()); } }; @@ -149,7 +149,7 @@ public static void resetTag(UUID uuid, Consumer consumer) { Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 return Map.of("placeholder", "body"); } @@ -171,7 +171,7 @@ public static void reportPlayer(UUID uuid, String reason, Consumer Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { return Map.of("reason", reason); } }; @@ -191,7 +191,7 @@ public static void banPlayer(UUID uuid, String reason, Consumer con Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { return Map.of("reason", reason); } }; @@ -212,7 +212,7 @@ public static void unbanPlayer(UUID uuid, Consumer consumer) { Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 return Map.of("placeholder", "body"); } @@ -234,7 +234,7 @@ public static void appealBan(String reason, Consumer consumer) { Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { return Map.of("reason", reason); } }; @@ -254,7 +254,7 @@ public static void toggleAdmin(UUID uuid, Consumer consumer) { Util.getSessionToken() ) { @Override - public Map getBody() { + public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 return Map.of("placeholder", "body"); } diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java index cd5de6e..ba1d952 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiRequest.java @@ -40,7 +40,7 @@ public void sendAsyncRequest(Callback callback) { .handleErrorStream() .async(); - Map body = getBody(); + Map body = getBody(); if(body != null) request.json(body); @@ -79,7 +79,7 @@ public String getMessage() { public String getError() { return error; } - public abstract Map getBody(); + public abstract Map getBody(); public static void useLocalizedResponses(boolean value) { localizedResponses = value; From 887d9b59da9e3dd512051fb13a9b478da7a7dd7f Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 26 Jun 2024 18:23:55 +0200 Subject: [PATCH 091/105] Add some more nullable and notnull annotations to PlayerInfo --- .../main/java/com/rappytv/globaltags/types/PlayerInfo.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 5670daf..99129ef 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -32,6 +32,7 @@ public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean a /** * Returns the player's uuid */ + @NotNull public UUID getUUID() { return uuid; } @@ -55,6 +56,7 @@ public String getPlainTag() { /** * Returns the player's GlobalTag position */ + @NotNull public PositionType getPosition() { if(position == null) return PositionType.ABOVE_NAME; return switch(position) { @@ -68,6 +70,7 @@ public PositionType getPosition() { /** * Returns the {@link GlobalIcon} enum value which the player has selected */ + @NotNull public GlobalIcon getGlobalIcon() { try { return GlobalIcon.valueOf(icon); @@ -117,6 +120,7 @@ public boolean isSuspended() { /** * Gets the suspension object from a player */ + @NotNull public Suspension getSuspension() { return suspension; } From 9eacde9b703c6849d18e8d44cb11a3d9be4740d3 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 26 Jun 2024 19:18:43 +0200 Subject: [PATCH 092/105] Add api request to edit ban info --- .../rappytv/globaltags/api/ApiHandler.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index b281973..9e262e7 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -2,6 +2,7 @@ import com.rappytv.globaltags.types.GlobalIcon; import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.types.PlayerInfo.Suspension; import com.rappytv.globaltags.util.TagCache; import com.rappytv.globaltags.util.Util; import net.labymod.api.Laby; @@ -10,6 +11,7 @@ import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.util.io.web.request.Request.Method; import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.function.Consumer; @@ -227,6 +229,28 @@ public Map getBody() { }); } + public static void editBan(UUID uuid, Suspension suspension, Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.PUT, + "/players/" + uuid + "/ban", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + Objects.requireNonNull(suspension.getReason(), "Reason must not be null"); + return Map.of("reason", suspension.getReason(), "appealable", suspension.isAppealable()); + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); + return; + } + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + }); + } + public static void appealBan(String reason, Consumer consumer) { ApiRequest request = new ApiRequest( Method.POST, From 893287c48c0916855f7dd7e083be42cbc75e3164 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Wed, 26 Jun 2024 19:28:11 +0200 Subject: [PATCH 093/105] Add bullet point to edit bans --- .../rappytv/globaltags/GlobalTagAddon.java | 4 +- .../activities/EditBanActivity.java | 116 ++++++++++++++++++ .../interaction/EditBanInfoBulletPoint.java | 45 +++++++ .../assets/globaltags/i18n/en_us.json | 6 + .../globaltags/themes/fancy/lss/input.lss | 11 ++ .../globaltags/themes/vanilla/lss/input.lss | 15 ++- 6 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/com/rappytv/globaltags/activities/EditBanActivity.java create mode 100644 core/src/main/java/com/rappytv/globaltags/interaction/EditBanInfoBulletPoint.java diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index f7a13f2..8194189 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -3,6 +3,7 @@ import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.command.GlobalTagCommand; import com.rappytv.globaltags.config.GlobalTagConfig; +import com.rappytv.globaltags.interaction.EditBanInfoBulletPoint; import com.rappytv.globaltags.interaction.ToggleBanBulletPoint; import com.rappytv.globaltags.interaction.ChangeTagBulletPoint; import com.rappytv.globaltags.interaction.ClearTagBulletPoint; @@ -55,11 +56,12 @@ protected void enable() { new CustomTag(this, positionType) ); registerListener(new ServerNavigationListener()); - labyAPI().interactionMenuRegistry().register(new ToggleBanBulletPoint()); labyAPI().interactionMenuRegistry().register(new ChangeTagBulletPoint()); labyAPI().interactionMenuRegistry().register(new ClearTagBulletPoint()); + labyAPI().interactionMenuRegistry().register(new EditBanInfoBulletPoint()); labyAPI().interactionMenuRegistry().register(new ReportBulletPoint()); labyAPI().interactionMenuRegistry().register(new ToggleAdminBulletPoint()); + labyAPI().interactionMenuRegistry().register(new ToggleBanBulletPoint()); registerCommand(new GlobalTagCommand()); // Clear cache every 5 minutes diff --git a/core/src/main/java/com/rappytv/globaltags/activities/EditBanActivity.java b/core/src/main/java/com/rappytv/globaltags/activities/EditBanActivity.java new file mode 100644 index 0000000..646dda3 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/activities/EditBanActivity.java @@ -0,0 +1,116 @@ +package com.rappytv.globaltags.activities; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; +import java.util.UUID; +import java.util.function.Consumer; +import com.rappytv.globaltags.types.PlayerInfo.Suspension; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.client.gui.screen.Parent; +import net.labymod.api.client.gui.screen.ScreenInstance; +import net.labymod.api.client.gui.screen.activity.AutoActivity; +import net.labymod.api.client.gui.screen.activity.Link; +import net.labymod.api.client.gui.screen.activity.types.SimpleActivity; +import net.labymod.api.client.gui.screen.widget.Widget; +import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.CheckBoxWidget; +import net.labymod.api.client.gui.screen.widget.widgets.input.CheckBoxWidget.State; +import net.labymod.api.client.gui.screen.widget.widgets.input.TextFieldWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.FlexibleContentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; + +@Link("input.lss") +@AutoActivity +public class EditBanActivity extends SimpleActivity { + + private final UUID uuid; + private final String username; + + public EditBanActivity(UUID uuid, String username) { + this.uuid = uuid; + this.username = username; + } + + @Override + public void initialize(Parent parent) { + super.initialize(parent); + TagCache.resolve(uuid, (info) -> { + Suspension suspension = info.getSuspension(); + FlexibleContentWidget windowWidget = new FlexibleContentWidget().addId("window"); + HorizontalListWidget profileWrapper = new HorizontalListWidget().addId("header"); + IconWidget headWidget = new IconWidget(Icon.head(this.uuid)).addId("head"); + ComponentWidget titleWidget = ComponentWidget.i18n( + "globaltags.context.editBan.title", + this.username + ).addId("username"); + VerticalListWidget content = new VerticalListWidget<>().addId("content"); + ComponentWidget inputLabelWidget = ComponentWidget.i18n("globaltags.context.reason") + .addId("label"); + TextFieldWidget inputWidget = new TextFieldWidget() + .placeholder(Component.translatable( + "globaltags.context.placeholder", + NamedTextColor.DARK_GRAY + )) + .addId("input"); + String reason = suspension.getReason(); + if(reason != null) inputWidget.setText(reason, true); + ComponentWidget boxLabelWidget = ComponentWidget + .i18n("globaltags.context.editBan.appealable") + .addId("appealable-label"); + CheckBoxWidget checkBoxWidget = new CheckBoxWidget().addId("check-box"); + checkBoxWidget.setState(suspension.isAppealable() ? State.CHECKED : State.UNCHECKED); + ButtonWidget sendButton = new ButtonWidget() + .updateComponent(Component.translatable( + "globaltags.context.editBan.send", + NamedTextColor.AQUA + )) + .addId("send-button"); + sendButton.setEnabled(false); + sendButton.setActionListener(() -> { + Laby.labyAPI().minecraft().minecraftWindow().displayScreen((ScreenInstance) null); + Suspension editedSuspension = new Suspension( + inputWidget.getText(), + checkBoxWidget.state() == State.CHECKED + ); + ApiHandler.editBan(uuid, editedSuspension, (response) -> + Laby.references().chatExecutor().displayClientMessage( + Component.empty() + .append(GlobalTagAddon.prefix) + .append(response.getMessage()) + ) + ); + }); + Consumer updateButton = (text) -> { + boolean reasonNotEmpty = !text.isBlank(); + boolean updatedReason = !text.equals(suspension.getReason()); + boolean updatedCheckbox = + (checkBoxWidget.state() == State.CHECKED) != suspension.isAppealable(); + sendButton.setEnabled(reasonNotEmpty && (updatedReason || updatedCheckbox)); + }; + inputWidget.updateListener(updateButton); + checkBoxWidget.setActionListener(() -> + updateButton.accept(inputWidget.getText()) + ); + + profileWrapper.addEntry(headWidget); + profileWrapper.addEntry(titleWidget); + + content.addChild(inputLabelWidget); + content.addChild(inputWidget); + content.addChild(boxLabelWidget); + content.addChild(checkBoxWidget); + content.addChild(sendButton); + + windowWidget.addContent(profileWrapper); + windowWidget.addContent(content); + this.document.addChild(windowWidget); + }); + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/interaction/EditBanInfoBulletPoint.java b/core/src/main/java/com/rappytv/globaltags/interaction/EditBanInfoBulletPoint.java new file mode 100644 index 0000000..4071182 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/interaction/EditBanInfoBulletPoint.java @@ -0,0 +1,45 @@ +package com.rappytv.globaltags.interaction; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.activities.BanActivity; +import com.rappytv.globaltags.activities.EditBanActivity; +import com.rappytv.globaltags.api.ApiHandler; +import com.rappytv.globaltags.types.PlayerInfo; +import com.rappytv.globaltags.util.TagCache; +import net.labymod.api.Laby; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.interaction.BulletPoint; +import net.labymod.api.client.gui.icon.Icon; + +public class EditBanInfoBulletPoint implements BulletPoint { + + private PlayerInfo target; + + @Override + public Component getTitle() { + return Component.translatable("globaltags.context.editBan.name"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + Laby.labyAPI().minecraft().executeNextTick(() -> + Laby.labyAPI().minecraft().minecraftWindow().displayScreen(new EditBanActivity( + player.getUniqueId(), + player.getName() + )) + ); + } + + @Override + public boolean isVisible(Player player) { + PlayerInfo executer = TagCache.get(Laby.labyAPI().getUniqueId()); + target = TagCache.get(player.getUniqueId()); + return executer != null && executer.isAdmin() && target != null && target.isSuspended(); + } +} diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 5f2501d..600ae0a 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -136,6 +136,12 @@ "title": "Unban %s", "send": "Unban" }, + "editBan": { + "name": "Edit GlobalTag ban", + "title": "Edit %s's ban", + "send": "Submit changes", + "appealable": "Appealable" + }, "changeTag": { "name": "Change GlobalTag", "title": "Change %s's Tag", diff --git a/core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss b/core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss index 1efc3ca..1fe3651 100644 --- a/core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss +++ b/core/src/main/resources/assets/globaltags/themes/fancy/lss/input.lss @@ -47,6 +47,17 @@ alignment-y: center; } + .appealable-label { + margin-top: 8; + alignment-x: center; + alignment-y: center; + } + + .check-box { + margin-top: 5; + alignment-x: center; + } + .send-button { margin-top: 5; width: 50; diff --git a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss index 54dc30c..d70ab1e 100644 --- a/core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss +++ b/core/src/main/resources/assets/globaltags/themes/vanilla/lss/input.lss @@ -35,7 +35,7 @@ overwrite-width: false; .label { - margin-top: 40; + margin-top: 30; alignment-x: center; alignment-y: center; } @@ -47,9 +47,20 @@ alignment-y: center; } + .appealable-label { + margin-top: 8; + alignment-x: center; + alignment-y: center; + } + + .check-box { + margin-top: 5; + alignment-x: center; + } + .send-button { margin-top: 5; - width: 70; + width: 80; height: 20; alignment-x: center; alignment-y: center; From dd0362d01b8a184ed1182b23a6cbcaff48ef7bce Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 28 Jun 2024 15:34:44 +0200 Subject: [PATCH 094/105] Load empty suspension when ban is null --- .../main/java/com/rappytv/globaltags/types/PlayerInfo.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java index 99129ef..53fb348 100644 --- a/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java +++ b/api/src/main/java/com/rappytv/globaltags/types/PlayerInfo.java @@ -7,6 +7,7 @@ import net.labymod.api.client.gui.icon.Icon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; import java.util.UUID; public class PlayerInfo { @@ -26,7 +27,7 @@ public PlayerInfo(UUID uuid, String tag, String position, String icon, boolean a this.position = position; this.icon = icon; this.admin = admin; - this.suspension = new Suspension(ban); + this.suspension = ban != null ? new Suspension(ban) : new Suspension(); } /** @@ -136,6 +137,7 @@ public static class Suspension { * Creates a suspension from a {@link Ban} object */ public Suspension(Ban ban) { + Objects.requireNonNull(ban, "Ban must not be null"); this.active = ban.active; this.reason = ban.reason; this.appealable = ban.appealable; From 2a0f2e0f110e80d3e41b52215ebba496faa8f90a Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 28 Jun 2024 15:35:37 +0200 Subject: [PATCH 095/105] Fix lss display in tag preview --- .../globaltags/config/widget/TagPreviewWidget.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index fc53f97..439a5ef 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -75,7 +75,7 @@ public void initialize(boolean refetched) { ComponentWidget errorComponent = ComponentWidget.component(error) .addId("text", "error"); errorComponent.setSize(SizeType.MAX, WidgetSide.WIDTH, WidgetSize.fixed(500)); - this.addEntry(errorComponent); + this.addEntryInitialized(errorComponent); } else { if(refetched) { config.tag().set(info.getPlainTag()); @@ -100,14 +100,14 @@ public void initialize(boolean refetched) { : Util.translateColorCodes(config.tag().get()) ).addId("text"); if (config.icon().get() != GlobalIcon.NONE) - this.addEntry(new IconWidget(config.icon().get().getIcon()).addId("icon")); - this.addEntry(tag); + this.addEntryInitialized(new IconWidget(config.icon().get().getIcon()).addId("icon")); + this.addEntryInitialized(tag); if (info.isAdmin()) - this.addEntry(new IconWidget(adminIcon).addId("staff-icon")); + this.addEntryInitialized(new IconWidget(adminIcon).addId("staff-icon")); } ButtonWidget refreshButton = ButtonWidget.icon(SpriteCommon.REFRESH, TagPreviewWidget::refetch) .addId("refresh-button"); - addEntry(refreshButton); + addEntryInitialized(refreshButton); if(info != null && info.isSuspended()) { ButtonWidget appealButton = ButtonWidget.i18n( "globaltags.settings.tags.tagPreview.appeal.name", @@ -118,7 +118,7 @@ public void initialize(boolean refetched) { NamedTextColor.GOLD )); appealButton.setEnabled(info.getSuspension().isAppealable()); - addEntry(appealButton); + addEntryInitialized(appealButton); } })); } From 0b5ce044ed45bd4952d7905827961f9898ad21d2 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 28 Jun 2024 20:11:20 +0200 Subject: [PATCH 096/105] Don't edit ComponentWidget width because the bug is getting fixed --- .../util/SimpleAdvancedWidePopup.java | 26 ------------------- .../com/rappytv/globaltags/util/Util.java | 2 +- .../config/widget/TagPreviewWidget.java | 4 --- 3 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java diff --git a/api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java b/api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java deleted file mode 100644 index 734d583..0000000 --- a/api/src/main/java/com/rappytv/globaltags/util/SimpleAdvancedWidePopup.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.rappytv.globaltags.util; - -import net.labymod.api.client.gui.screen.widget.Widget; -import net.labymod.api.client.gui.screen.widget.size.SizeType; -import net.labymod.api.client.gui.screen.widget.size.WidgetSide; -import net.labymod.api.client.gui.screen.widget.size.WidgetSize; -import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; -import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; -import net.labymod.api.client.gui.screen.widget.widgets.popup.SimpleAdvancedPopup; - -public class SimpleAdvancedWidePopup extends SimpleAdvancedPopup { - - @Override - protected void initializeComponents(VerticalListWidget container) { - if (this.title != null) { - container.addChild(ComponentWidget.component(this.title).addId("popup-title")); - } - - if (this.description != null) { - ComponentWidget description = ComponentWidget.component(this.description) - .addId("popup-description"); - description.setSize(SizeType.MAX, WidgetSide.WIDTH, WidgetSize.fixed(500)); - container.addChild(description); - } - } -} diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index ed11f81..d9a33ac 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -45,7 +45,7 @@ public static void update(ResultType type, Component component) { case ICON -> iconResponse = component; } if(tagResponse == null || positionResponse == null || iconResponse == null) return; - SimpleAdvancedPopup popup = SimpleAdvancedWidePopup + SimpleAdvancedPopup popup = SimpleAdvancedPopup .builder() .title(Component.text("Update result", NamedTextColor.AQUA)) .description(Component.translatable( diff --git a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java index 439a5ef..9692397 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java +++ b/core/src/main/java/com/rappytv/globaltags/config/widget/TagPreviewWidget.java @@ -13,9 +13,6 @@ import net.labymod.api.client.gui.lss.property.annotation.AutoWidget; import net.labymod.api.client.gui.screen.Parent; import net.labymod.api.client.gui.screen.activity.Link; -import net.labymod.api.client.gui.screen.widget.size.SizeType; -import net.labymod.api.client.gui.screen.widget.size.WidgetSide; -import net.labymod.api.client.gui.screen.widget.size.WidgetSize; import net.labymod.api.client.gui.screen.widget.widgets.ComponentWidget; import net.labymod.api.client.gui.screen.widget.widgets.input.ButtonWidget; import net.labymod.api.client.gui.screen.widget.widgets.layout.list.HorizontalListWidget; @@ -74,7 +71,6 @@ public void initialize(boolean refetched) { if (error != null) { ComponentWidget errorComponent = ComponentWidget.component(error) .addId("text", "error"); - errorComponent.setSize(SizeType.MAX, WidgetSide.WIDTH, WidgetSize.fixed(500)); this.addEntryInitialized(errorComponent); } else { if(refetched) { From 53e764d3faead8e32459ba4df7556cfaff312bde Mon Sep 17 00:00:00 2001 From: RappyTV Date: Fri, 28 Jun 2024 20:42:53 +0200 Subject: [PATCH 097/105] Resolve self after every cache clear --- api/src/main/java/com/rappytv/globaltags/util/Util.java | 1 + .../globaltags/command/subcommands/ClearCacheCommand.java | 1 + .../main/java/com/rappytv/globaltags/config/GlobalTagConfig.java | 1 + 3 files changed, 3 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/util/Util.java b/api/src/main/java/com/rappytv/globaltags/util/Util.java index d9a33ac..aeb6598 100644 --- a/api/src/main/java/com/rappytv/globaltags/util/Util.java +++ b/api/src/main/java/com/rappytv/globaltags/util/Util.java @@ -59,6 +59,7 @@ public static void update(ResultType type, Component component) { Laby.labyAPI().minecraft().executeOnRenderThread(() -> { popup.displayInOverlay(); TagCache.clear(); + TagCache.resolveSelf(); tagResponse = null; positionResponse = null; iconResponse = null; diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java index 525524c..0661598 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/ClearCacheCommand.java @@ -15,6 +15,7 @@ public ClearCacheCommand() { @Override public boolean execute(String prefix, String[] arguments) { TagCache.clear(); + TagCache.resolveSelf(); displayMessage( Component.empty() .append(GlobalTagAddon.prefix) diff --git a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java index 83d21db..fd4b51e 100644 --- a/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java +++ b/core/src/main/java/com/rappytv/globaltags/config/GlobalTagConfig.java @@ -64,6 +64,7 @@ public void joinDiscord(Setting setting) { @SpriteSlot(size = 32, y = 2) public void clearCache(Setting setting) { TagCache.clear(); + TagCache.resolveSelf(); Util.notify( I18n.translate("globaltags.notifications.success"), I18n.translate("globaltags.notifications.cacheCleared") From c3b6a1e7e71ad4965bf526c6045b654f39924ed1 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 29 Jun 2024 19:51:48 +0200 Subject: [PATCH 098/105] Add methods to ApiHandler to link and unlink discord account --- .../rappytv/globaltags/api/ApiHandler.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 9e262e7..9a82349 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -293,6 +293,50 @@ public Map getBody() { }); } + public static void linkDiscord(Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.POST, + "/players/" + Laby.labyAPI().getUniqueId() + "/connections/discord", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + // https://github.com/elysiajs/elysia/issues/495 + return Map.of("placeholder", "body"); + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); + return; + } + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.responseBody.code))); + }); + } + + public static void unlinkDiscord(Consumer consumer) { + ApiRequest request = new ApiRequest( + Method.DELETE, + "/players/" + Laby.labyAPI().getUniqueId() + "/connections/discord", + Util.getSessionToken() + ) { + @Override + public Map getBody() { + // https://github.com/elysiajs/elysia/issues/495 + return Map.of("placeholder", "body"); + } + }; + request.sendAsyncRequest((response) -> { + if(!request.isSuccessful()) { + consumer.accept(new ApiResponse(false, request.getError())); + return; + } + TagCache.clear(); + TagCache.resolveSelf((info) -> consumer.accept(new ApiResponse(true, request.getMessage()))); + }); + } + public static class ApiResponse { private final boolean successful; From 392d17115f8dbe7e24dc1a5bdbb17522970c8635 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 29 Jun 2024 19:52:24 +0200 Subject: [PATCH 099/105] Add subcommands to link and unlink discord account --- .../subcommands/LinkDiscordSubcommand.java | 32 +++++++++++++++++++ .../subcommands/UnlinkDiscordSubcommand.java | 20 ++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 core/src/main/java/com/rappytv/globaltags/command/subcommands/LinkDiscordSubcommand.java create mode 100644 core/src/main/java/com/rappytv/globaltags/command/subcommands/UnlinkDiscordSubcommand.java diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/LinkDiscordSubcommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/LinkDiscordSubcommand.java new file mode 100644 index 0000000..0c1ea9f --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/LinkDiscordSubcommand.java @@ -0,0 +1,32 @@ +package com.rappytv.globaltags.command.subcommands; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; +import net.labymod.api.Laby; +import net.labymod.api.client.chat.command.SubCommand; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.TextComponent; +import net.labymod.api.client.component.format.NamedTextColor; + +public class LinkDiscordSubcommand extends SubCommand { + + public LinkDiscordSubcommand() { + super("link"); + } + + @Override + public boolean execute(String s, String[] strings) { + ApiHandler.linkDiscord((info) -> { + if(info.isSuccessful()) { + String code = ((TextComponent) info.getMessage()).getText(); + Laby.references().chatExecutor().copyToClipboard(code); + displayMessage(GlobalTagAddon.prefix.copy().append( + Component.translatable("globaltags.messages.code", NamedTextColor.GREEN) + )); + } else displayMessage( + GlobalTagAddon.prefix.copy().append(info.getMessage()) + ); + }); + return true; + } +} diff --git a/core/src/main/java/com/rappytv/globaltags/command/subcommands/UnlinkDiscordSubcommand.java b/core/src/main/java/com/rappytv/globaltags/command/subcommands/UnlinkDiscordSubcommand.java new file mode 100644 index 0000000..d0351c7 --- /dev/null +++ b/core/src/main/java/com/rappytv/globaltags/command/subcommands/UnlinkDiscordSubcommand.java @@ -0,0 +1,20 @@ +package com.rappytv.globaltags.command.subcommands; + +import com.rappytv.globaltags.GlobalTagAddon; +import com.rappytv.globaltags.api.ApiHandler; +import net.labymod.api.client.chat.command.SubCommand; + +public class UnlinkDiscordSubcommand extends SubCommand { + + public UnlinkDiscordSubcommand() { + super("unlink"); + } + + @Override + public boolean execute(String s, String[] strings) { + ApiHandler.unlinkDiscord((response) -> displayMessage( + GlobalTagAddon.prefix.copy().append(response.getMessage())) + ); + return true; + } +} From e3e6fdf05bf65e0f183fcea7547bba736323ac5e Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 29 Jun 2024 19:52:54 +0200 Subject: [PATCH 100/105] Add code field to responseBody --- api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java index e2be23c..3313cfc 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ResponseBody.java @@ -13,8 +13,9 @@ public class ResponseBody { // For errors public String error; - // Version + // Other public String version; + public String code; public static class Ban { public boolean active; From 7010e00d71bc1fd893b057db162687135cd28bea Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 29 Jun 2024 19:53:08 +0200 Subject: [PATCH 101/105] Add translation --- core/src/main/resources/assets/globaltags/i18n/en_us.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/assets/globaltags/i18n/en_us.json b/core/src/main/resources/assets/globaltags/i18n/en_us.json index 600ae0a..6180d05 100644 --- a/core/src/main/resources/assets/globaltags/i18n/en_us.json +++ b/core/src/main/resources/assets/globaltags/i18n/en_us.json @@ -116,7 +116,8 @@ "messages": { "clearCache": "Clear cache", "hoverClearCache": "Click here to clear the tag cache!", - "offline": "Connection failed!" + "offline": "Connection failed!", + "code": "The code was copied to your clipboard!" }, "context": { "reason": "Reason", From eb98b31b66f3a5c204361a0e7296eb53bc4894e5 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 29 Jun 2024 19:53:18 +0200 Subject: [PATCH 102/105] Register subcommands on main command --- .../java/com/rappytv/globaltags/command/GlobalTagCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java index 57ae815..6f59867 100644 --- a/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java +++ b/core/src/main/java/com/rappytv/globaltags/command/GlobalTagCommand.java @@ -4,6 +4,8 @@ import com.rappytv.globaltags.api.ApiHandler; import com.rappytv.globaltags.api.ApiRequest; import com.rappytv.globaltags.command.subcommands.ClearCacheCommand; +import com.rappytv.globaltags.command.subcommands.LinkDiscordSubcommand; +import com.rappytv.globaltags.command.subcommands.UnlinkDiscordSubcommand; import net.labymod.api.client.chat.command.Command; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.TextComponent; @@ -19,6 +21,8 @@ public GlobalTagCommand() { super("globaltags", "globaltag", "gt"); withSubCommand(new ClearCacheCommand()); + withSubCommand(new LinkDiscordSubcommand()); + withSubCommand(new UnlinkDiscordSubcommand()); } @Override From ebb4930fec753c0e4b1f25fdd5722675f82580dc Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 6 Jul 2024 13:47:41 +0200 Subject: [PATCH 103/105] Optimize Map#of usage in ApiHandler --- .../java/com/rappytv/globaltags/api/ApiHandler.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java index 9a82349..5d1369e 100644 --- a/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java +++ b/api/src/main/java/com/rappytv/globaltags/api/ApiHandler.java @@ -18,6 +18,8 @@ @SuppressWarnings("unused") public class ApiHandler { + private static final Map emptyBody = Map.of("body", "placeholder body"); + private ApiHandler() {} public static void getVersion(Consumer consumer) { @@ -153,7 +155,7 @@ public static void resetTag(UUID uuid, Consumer consumer) { @Override public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 - return Map.of("placeholder", "body"); + return emptyBody; } }; request.sendAsyncRequest((response) -> { @@ -216,7 +218,7 @@ public static void unbanPlayer(UUID uuid, Consumer consumer) { @Override public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 - return Map.of("placeholder", "body"); + return emptyBody; } }; request.sendAsyncRequest((response) -> { @@ -280,7 +282,7 @@ public static void toggleAdmin(UUID uuid, Consumer consumer) { @Override public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 - return Map.of("placeholder", "body"); + return emptyBody; } }; request.sendAsyncRequest((response) -> { @@ -302,7 +304,7 @@ public static void linkDiscord(Consumer consumer) { @Override public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 - return Map.of("placeholder", "body"); + return emptyBody; } }; request.sendAsyncRequest((response) -> { @@ -324,7 +326,7 @@ public static void unlinkDiscord(Consumer consumer) { @Override public Map getBody() { // https://github.com/elysiajs/elysia/issues/495 - return Map.of("placeholder", "body"); + return emptyBody; } }; request.sendAsyncRequest((response) -> { From 26cff753d175f79385868673ec3158fbdcf8297d Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 6 Jul 2024 17:06:10 +0200 Subject: [PATCH 104/105] Update date for 1.2.0 revision --- core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 8194189..3ed4d70 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -38,7 +38,7 @@ protected void preConfigurationLoad() { Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.0"), "2023-11-24")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.7"), "2024-02-27")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.9"), "2024-06-01")); - Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.2.0"), "2024-06-19")); + Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.2.0"), "2024-07-06")); addon = this; } From bc7b8b3a6dfeb5511a0707a488172944f9bb5af9 Mon Sep 17 00:00:00 2001 From: RappyTV Date: Sat, 6 Jul 2024 17:07:28 +0200 Subject: [PATCH 105/105] Remove unused addon property --- core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java index 3ed4d70..41d978e 100644 --- a/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java +++ b/core/src/main/java/com/rappytv/globaltags/GlobalTagAddon.java @@ -31,7 +31,6 @@ public class GlobalTagAddon extends LabyAddon { public static Component prefix = Component.empty() .append(Component.text("GlobalTags").color(NamedTextColor.BLUE).decorate(TextDecoration.BOLD)) .append(Component.text(" » ", NamedTextColor.DARK_GRAY)); - private static GlobalTagAddon addon; @Override protected void preConfigurationLoad() { @@ -39,13 +38,12 @@ protected void preConfigurationLoad() { Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.7"), "2024-02-27")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.1.9"), "2024-06-01")); Laby.references().revisionRegistry().register(new SimpleRevision("globaltags", new SemanticVersion("1.2.0"), "2024-07-06")); - addon = this; } @Override protected void enable() { registerSettingCategory(); - ApiRequest.addonVersion(addon.addonInfo().getVersion()); + ApiRequest.addonVersion(addonInfo().getVersion()); TagRegistry tagRegistry = labyAPI().tagRegistry(); for (PositionType positionType : PositionType.values())