diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4582323..7b52708 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,8 @@ jobs: run: chmod +x gradlew - name: Build with Gradle run: ./gradlew build --full-stacktrace + - name: Create Release Artifact + run: ./gradlew createReleaseJar - name: Upload Artifact uses: actions/upload-artifact@v6 with: diff --git a/api/src/main/java/com/rappytv/betterfriends/api/FriendHelper.java b/api/src/main/java/com/rappytv/betterfriends/api/SessionHelper.java similarity index 77% rename from api/src/main/java/com/rappytv/betterfriends/api/FriendHelper.java rename to api/src/main/java/com/rappytv/betterfriends/api/SessionHelper.java index 036943f..7c9d88d 100644 --- a/api/src/main/java/com/rappytv/betterfriends/api/FriendHelper.java +++ b/api/src/main/java/com/rappytv/betterfriends/api/SessionHelper.java @@ -1,13 +1,16 @@ package com.rappytv.betterfriends.api; import java.util.UUID; +import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.protocol.model.friend.Friend; import net.labymod.api.mojang.GameProfile; import net.labymod.api.reference.annotation.Referenceable; import org.jetbrains.annotations.Nullable; @Referenceable -public interface FriendHelper { +public interface SessionHelper { + + LabyConnectSession getValidSession(); @Nullable default Friend getFriend(GameProfile profile) { diff --git a/api/src/main/java/com/rappytv/betterfriends/api/blocklist/BlockedPlayer.java b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/BlockedPlayer.java new file mode 100644 index 0000000..6b742d3 --- /dev/null +++ b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/BlockedPlayer.java @@ -0,0 +1,7 @@ +package com.rappytv.betterfriends.api.blocklist; + +import java.util.UUID; + +public record BlockedPlayer(UUID uuid, String username) { + +} diff --git a/api/src/main/java/com/rappytv/betterfriends/api/blocklist/BlocklistManager.java b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/BlocklistManager.java new file mode 100644 index 0000000..a984310 --- /dev/null +++ b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/BlocklistManager.java @@ -0,0 +1,21 @@ +package com.rappytv.betterfriends.api.blocklist; + +import java.util.List; +import java.util.UUID; +import net.labymod.api.reference.annotation.Referenceable; + +@Referenceable +public interface BlocklistManager { + + boolean isBlocked(UUID uuid); + + List getBlockedPlayers(); + + void loadBlocklist(List players); + + void block(UUID uuid, String username); + + void block(BlockedPlayer player); + + void unblock(UUID uuid); +} diff --git a/api/src/main/java/com/rappytv/betterfriends/api/blocklist/event/BlockPlayerEvent.java b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/event/BlockPlayerEvent.java new file mode 100644 index 0000000..c5238e5 --- /dev/null +++ b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/event/BlockPlayerEvent.java @@ -0,0 +1,8 @@ +package com.rappytv.betterfriends.api.blocklist.event; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import net.labymod.api.event.Event; + +public record BlockPlayerEvent(BlockedPlayer player) implements Event { + +} diff --git a/api/src/main/java/com/rappytv/betterfriends/api/blocklist/event/UnblockPlayerEvent.java b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/event/UnblockPlayerEvent.java new file mode 100644 index 0000000..2e31ca7 --- /dev/null +++ b/api/src/main/java/com/rappytv/betterfriends/api/blocklist/event/UnblockPlayerEvent.java @@ -0,0 +1,8 @@ +package com.rappytv.betterfriends.api.blocklist.event; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import net.labymod.api.event.Event; + +public record UnblockPlayerEvent(BlockedPlayer player) implements Event { + +} diff --git a/api/src/main/java/com/rappytv/betterfriends/api/ui/BetterFriendsTextures.java b/api/src/main/java/com/rappytv/betterfriends/api/ui/BetterFriendsTextures.java new file mode 100644 index 0000000..847f38f --- /dev/null +++ b/api/src/main/java/com/rappytv/betterfriends/api/ui/BetterFriendsTextures.java @@ -0,0 +1,13 @@ +package com.rappytv.betterfriends.api.ui; + +import net.labymod.api.client.gui.icon.Icon; +import net.labymod.api.client.resources.ResourceLocation; + +public class BetterFriendsTextures { + + public static final Icon BLOCKED = Icon.texture(ResourceLocation.create( + "betterfriends", + "textures/blocked.png" + )); + +} diff --git a/build.gradle.kts b/build.gradle.kts index c467776..26e75ec 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,21 +6,11 @@ plugins { val versions = providers.gradleProperty("net.labymod.minecraft-versions").get().split(";") group = "org.example" -version = providers.environmentVariable("VERSION").getOrElse("1.1.1") +version = providers.environmentVariable("VERSION").getOrElse("1.1.2") labyMod { defaultPackageName = "com.rappytv.betterfriends" - minecraft { - registerVersion(versions.toTypedArray()) { - runs { - getByName("client") { - devLogin = true - } - } - } - } - addonInfo { namespace = "betterfriends" displayName = "BetterFriends" @@ -31,6 +21,16 @@ labyMod { addon("voicechat", true) } + + minecraft { + registerVersion(versions.toTypedArray()) { + runs { + getByName("client") { + devLogin = true + } + } + } + } } subprojects { diff --git a/core/src/main/java/com/rappytv/betterfriends/core/BetterFriendsAddon.java b/core/src/main/java/com/rappytv/betterfriends/core/BetterFriendsAddon.java index ed47049..2e8fe62 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/BetterFriendsAddon.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/BetterFriendsAddon.java @@ -3,27 +3,33 @@ import com.rappytv.betterfriends.api.generated.ReferenceStorage; import com.rappytv.betterfriends.core.command.BetterFriendsCommand; import com.rappytv.betterfriends.core.config.BetterFriendsConfig; +import com.rappytv.betterfriends.core.interactions.BlockPlayerBullet; import com.rappytv.betterfriends.core.interactions.FriendNoteEditorBullet; import com.rappytv.betterfriends.core.interactions.FriendTogglePinBullet; +import com.rappytv.betterfriends.core.interactions.UnblockPlayerBullet; import com.rappytv.betterfriends.core.listeners.ChatReceiveListener; import com.rappytv.betterfriends.core.listeners.ConfigVersionListener; import com.rappytv.betterfriends.core.listeners.FriendListener; import com.rappytv.betterfriends.core.listeners.FriendRequestListener; import com.rappytv.betterfriends.core.listeners.LabyChatReceiveListener; +import com.rappytv.betterfriends.core.listeners.PlayerBlockListener; import com.rappytv.betterfriends.core.listeners.TemporaryPinListener; import com.rappytv.betterfriends.core.ui.badge.FriendPinBadge; import com.rappytv.betterfriends.core.ui.hud.FriendCountHudWidget; import com.rappytv.betterfriends.core.ui.hud.IncomingFriendRequestCountHudWidget; import com.rappytv.betterfriends.core.ui.hud.OnlineFriendCountHudWidget; import com.rappytv.betterfriends.core.ui.hud.UnreadChatCountWidget; +import com.rappytv.betterfriends.core.ui.tags.BlockedPlayerIconTag; import com.rappytv.betterfriends.core.ui.tags.FriendNoteNameTag; import com.rappytv.betterfriends.core.ui.tags.FriendPinIconTag; 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.entity.player.tag.PositionType; import net.labymod.api.client.gui.hud.binding.category.HudWidgetCategory; import net.labymod.api.models.addon.annotation.AddonMain; +import net.labymod.api.notification.Notification; import net.labymod.api.revision.SimpleRevision; import net.labymod.api.util.version.SemanticVersion; @@ -45,6 +51,11 @@ protected void preConfigurationLoad() { new SemanticVersion(1, 1, 0), "2026-04-30" )); + Laby.references().revisionRegistry().register(new SimpleRevision( + "betterfriends", + new SemanticVersion(1, 1, 2), + "2026-06-18" + )); } @Override @@ -52,16 +63,22 @@ protected void enable() { INSTANCE = this; this.registerSettingCategory(); + references().blocklistManager() + .loadBlocklist(this.configuration().blocklist().blockedPlayers()); + this.registerCommand(new BetterFriendsCommand()); this.registerListener(new ChatReceiveListener(this)); this.registerListener(new FriendListener(this)); this.registerListener(new FriendRequestListener(this)); this.registerListener(new LabyChatReceiveListener(this)); + this.registerListener(new PlayerBlockListener(this)); this.registerListener(new TemporaryPinListener(this)); + this.labyAPI().interactionMenuRegistry().register(new BlockPlayerBullet(this)); this.labyAPI().interactionMenuRegistry().register(new FriendNoteEditorBullet(this)); this.labyAPI().interactionMenuRegistry().register(new FriendTogglePinBullet(this)); + this.labyAPI().interactionMenuRegistry().register(new UnblockPlayerBullet(this)); HudWidgetCategory category = new HudWidgetCategory(this, "widgets"); this.labyAPI().hudWidgetRegistry().categoryRegistry().register(category); @@ -75,9 +92,15 @@ protected void enable() { "labymod_role", "betterfriends_friend_note", position, - new FriendNoteNameTag(this, position) + new FriendNoteNameTag(position) ); } + this.labyAPI().tagRegistry().registerBefore( + "VoiceTag", + "betterfriends_blocked_icon", + PositionType.RIGHT_TO_NAME, + new BlockedPlayerIconTag() + ); this.labyAPI().tagRegistry().registerBefore( "VoiceTag", "betterfriends_pin_icon", @@ -104,4 +127,22 @@ public static ReferenceStorage references() { public static Component getPrefix() { return INSTANCE.configuration().prefixCustomizationConfig().buildPrefix(); } + + public static boolean isVoiceChatEnabled() { + return Laby.labyAPI().addonService().isEnabled("voicechat"); + } + + public static void displayNotifications(String titleKey, Component component) { + Laby.references().chatExecutor().displayClientMessage( + BetterFriendsAddon.getPrefix().append(component) + ); + + if (!Laby.labyAPI().minecraft().isIngame()) { + Notification.builder() + .title(Component.translatable(titleKey)) + .text(component.color(NamedTextColor.WHITE)) + .duration(10000) + .buildAndPush(); + } + } } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/command/BetterFriendsCommand.java b/core/src/main/java/com/rappytv/betterfriends/core/command/BetterFriendsCommand.java index 1dc1a6f..8fa4d49 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/command/BetterFriendsCommand.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/command/BetterFriendsCommand.java @@ -1,5 +1,7 @@ package com.rappytv.betterfriends.core.command; +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; import com.rappytv.betterfriends.core.BetterFriendsAddon; import com.rappytv.betterfriends.core.listeners.LabyChatReceiveListener; import com.rappytv.betterfriends.core.utils.GroupHelper; @@ -12,6 +14,7 @@ import net.labymod.api.client.chat.command.SubCommand; import net.labymod.api.client.component.Component; import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.client.entity.player.Player; import net.labymod.api.client.network.server.ServerInfo; import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.protocol.model.User; @@ -19,6 +22,7 @@ import net.labymod.api.labyconnect.protocol.model.chat.ChatMessage; import net.labymod.api.labyconnect.protocol.model.chat.TextChatMessage; import net.labymod.api.labyconnect.protocol.model.request.IncomingFriendRequest; +import org.jetbrains.annotations.Nullable; public class BetterFriendsCommand extends Command { @@ -27,6 +31,8 @@ public BetterFriendsCommand() { this.translationKey("betterfriends.command"); this.withSubCommand(new AcceptFriendRequestSubcommand()); + this.withSubCommand(new BlockPlayerSubcommand()); + this.withSubCommand(new UnblockPlayerSubcommand()); this.withSubCommand(new DeclineFriendRequestSubcommand()); this.withSubCommand(new JoinServerSubcommand()); this.withSubCommand(new MessageSubcommand()); @@ -55,9 +61,9 @@ public boolean execute(String prefix, String[] arguments) { return true; } - public static class AcceptFriendRequestSubcommand extends SubCommand { + private static class AcceptFriendRequestSubcommand extends SubCommand { - protected AcceptFriendRequestSubcommand() { + private AcceptFriendRequestSubcommand() { super("accept"); this.translationKey("betterfriends.command.requests"); @@ -116,9 +122,135 @@ public boolean execute(String prefix, String[] arguments) { } } - public static class DeclineFriendRequestSubcommand extends SubCommand { + private static class BlockPlayerSubcommand extends SubCommand { - protected DeclineFriendRequestSubcommand() { + private final BlocklistManager manager = BetterFriendsAddon.references().blocklistManager(); + + private BlockPlayerSubcommand() { + super("block"); + + this.translationKey("betterfriends.command.block"); + } + + @Override + public boolean execute(String prefix, String[] arguments) { + if (arguments.length < 1) { + this.displayMessage( + Component.empty() + .append(BetterFriendsAddon.getPrefix()) + .append(Component.translatable( + this.getTranslationKey("enterName"), + NamedTextColor.RED + )) + ); + return true; + } + Player player = this.getPlayer(arguments[0]); + if (player == null) { + this.displayMessage( + Component.empty() + .append(BetterFriendsAddon.getPrefix()) + .append(Component.translatable( + this.getTranslationKey("playerNotFound"), + NamedTextColor.RED + )) + ); + return true; + } + if (Laby.labyAPI().getUniqueId().equals(player.getUniqueId())) { + this.displayMessage( + Component.empty() + .append(BetterFriendsAddon.getPrefix()) + .append(Component.translatable( + this.getTranslationKey("cantBlockSelf"), + NamedTextColor.RED + )) + ); + return true; + } + if (this.manager.isBlocked(player.getUniqueId())) { + this.displayMessage( + Component.empty() + .append(BetterFriendsAddon.getPrefix()) + .append(Component.translatable( + this.getTranslationKey("alreadyBlocked"), + NamedTextColor.RED + )) + ); + return true; + } + Laby.labyAPI().minecraft().executeNextTick(() -> + this.manager.block(player.getUniqueId(), player.getName()) + ); + return true; + } + + @Nullable + private Player getPlayer(String username) { + for (Player player : Laby.labyAPI().minecraft().clientWorld().getPlayers()) { + if (player.getName().equalsIgnoreCase(username)) { + return player; + } + } + + return null; + } + } + + private static class UnblockPlayerSubcommand extends SubCommand { + + private final BlocklistManager manager = BetterFriendsAddon.references().blocklistManager(); + + private UnblockPlayerSubcommand() { + super("unblock"); + + this.translationKey("betterfriends.command.block"); + } + + @Override + public boolean execute(String prefix, String[] arguments) { + if (arguments.length < 1) { + this.displayMessage( + Component.empty() + .append(BetterFriendsAddon.getPrefix()) + .append(Component.translatable( + this.getTranslationKey("enterName"), + NamedTextColor.RED + )) + ); + return true; + } + BlockedPlayer player = this.getPlayer(arguments[0]); + if (player == null) { + this.displayMessage( + Component.empty() + .append(BetterFriendsAddon.getPrefix()) + .append(Component.translatable( + this.getTranslationKey("notBlocked"), + NamedTextColor.RED + )) + ); + return true; + } + Laby.labyAPI().minecraft().executeNextTick(() -> this.manager.unblock(player.uuid())); + return true; + } + + @Nullable + private BlockedPlayer getPlayer(String username) { + for (BlockedPlayer player : this.manager.getBlockedPlayers()) { + if (player.username().equalsIgnoreCase(username)) { + return player; + } + } + + return null; + } + } + + private static class DeclineFriendRequestSubcommand extends SubCommand { + + private DeclineFriendRequestSubcommand() { super("decline"); this.translationKey("betterfriends.command.requests"); @@ -177,9 +309,9 @@ public boolean execute(String prefix, String[] arguments) { } } - public static class JoinServerSubcommand extends SubCommand { + private static class JoinServerSubcommand extends SubCommand { - protected JoinServerSubcommand() { + private JoinServerSubcommand() { super("join"); this.translationKey("betterfriends.command.join"); @@ -211,9 +343,9 @@ public boolean execute(String prefix, String[] arguments) { } } - public static class MessageSubcommand extends SubCommand { + private static class MessageSubcommand extends SubCommand { - protected MessageSubcommand() { + private MessageSubcommand() { super("message", "msg"); this.translationKey("betterfriends.command.message"); @@ -287,9 +419,9 @@ public boolean execute(String prefix, String[] arguments) { } } - public static class ReadSubcommand extends SubCommand { + private static class ReadSubcommand extends SubCommand { - protected ReadSubcommand() { + private ReadSubcommand() { super("read"); this.translationKey("betterfriends.command.read"); diff --git a/core/src/main/java/com/rappytv/betterfriends/core/config/BetterFriendsConfig.java b/core/src/main/java/com/rappytv/betterfriends/core/config/BetterFriendsConfig.java index 6e3f045..ebb867f 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/config/BetterFriendsConfig.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/config/BetterFriendsConfig.java @@ -1,5 +1,6 @@ package com.rappytv.betterfriends.core.config; +import com.rappytv.betterfriends.core.config.subconfig.BlocklistConfig; import com.rappytv.betterfriends.core.config.subconfig.FriendNoteTagConfig; import com.rappytv.betterfriends.core.config.subconfig.PinIconConfig; import com.rappytv.betterfriends.core.config.subconfig.PrefixCustomizationConfig; @@ -47,6 +48,10 @@ public class BetterFriendsConfig extends AddonConfig { private final ConfigProperty friendPrefix = new ConfigProperty<>("&aⒻ"); @SettingSection(value = "notifications", center = true) + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SpriteSlot(x = 2, y = 1) + private final BlocklistConfig blocklist = new BlocklistConfig(); + @SpriteSlot(x = 5) @SwitchSetting private final ConfigProperty friendRequestNotifications = new ConfigProperty<>(true); @@ -65,11 +70,11 @@ public class BetterFriendsConfig extends AddonConfig { @SwitchSetting private final ConfigProperty friendStatusUpdateNotifications = new ConfigProperty<>(true); - @SpriteSlot(x = 1, y = 1) + @SpriteSlot(x = 5, y = 2) @SwitchSetting private final ConfigProperty friendRemovalNotifications = new ConfigProperty<>(true); - @SpriteSlot(x = 2, y = 1) + @SpriteSlot(x = 1, y = 1) @SwitchSetting private final ConfigProperty friendRequestRemovalNotifications = new ConfigProperty<>(true); @@ -137,6 +142,10 @@ public ConfigProperty automaticFriendRequestReaction() { return this.automaticFriendRequestReaction; } + public BlocklistConfig blocklist() { + return this.blocklist; + } + public ConfigProperty friendServerSwitchNotifications() { return this.friendServerSwitchNotifications; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/BlocklistConfig.java b/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/BlocklistConfig.java new file mode 100644 index 0000000..aa03b23 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/BlocklistConfig.java @@ -0,0 +1,91 @@ +package com.rappytv.betterfriends.core.config.subconfig; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import com.rappytv.betterfriends.core.ui.activity.config.BlocklistActivity; +import java.util.ArrayList; +import java.util.List; +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.SwitchWidget.SwitchSetting; +import net.labymod.api.configuration.loader.Config; +import net.labymod.api.configuration.loader.annotation.Exclude; +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.annotation.SettingRequires; +import net.labymod.api.configuration.settings.annotation.SettingSection; +import net.labymod.api.util.MethodOrder; + +public class BlocklistConfig extends Config { + + @Exclude + private final List blockedPlayers = new ArrayList<>(); + + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SpriteSlot(y = 1) + @MethodOrder(after = "blockedPlayers") + @ActivitySetting + public Activity menu() { + return new BlocklistActivity(); + } + + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SpriteSlot(x = 2, y = 2) + @SwitchSetting + private final ConfigProperty showInteractionBullets = new ConfigProperty<>(true); + + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SpriteSlot(x = 2, y = 1) + @SwitchSetting + private final ConfigProperty showBlockIcon = new ConfigProperty<>(true); + + @SettingSection(value = "behavior", center = true) + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SpriteSlot(x = 5, y = 2) + @SwitchSetting + private final ConfigProperty unfriendBlockedPlayers = new ConfigProperty<>(true); + + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SpriteSlot(x = 3, y = 2) + @SwitchSetting + private final ConfigProperty muteInVoiceChat = new ConfigProperty<>(true); + + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SwitchSetting + @SpriteSlot(x = 1, y = 1) + private final ConfigProperty declineFriendRequests = new ConfigProperty<>(true); + + @IntroducedIn(namespace = "betterfriends", value = "1.1.2") + @SettingRequires("declineFriendRequests") + @SpriteSlot(x = 4, y = 2) + @SwitchSetting + private final ConfigProperty notifyOnFriendRequest = new ConfigProperty<>(false); + + public List blockedPlayers() { + return this.blockedPlayers; + } + + public ConfigProperty showBlockIcon() { + return this.showBlockIcon; + } + + public ConfigProperty showInteractionBullets() { + return this.showInteractionBullets; + } + + public ConfigProperty unfriendBlockedPlayers() { + return this.unfriendBlockedPlayers; + } + + public ConfigProperty muteInVoiceChat() { + return this.muteInVoiceChat; + } + + public ConfigProperty declineFriendRequests() { + return this.declineFriendRequests; + } + + public ConfigProperty notifyOnFriendRequest() { + return this.notifyOnFriendRequest; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/FriendNoteTagConfig.java b/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/FriendNoteTagConfig.java index f8ae08b..9a93c9c 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/FriendNoteTagConfig.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/FriendNoteTagConfig.java @@ -15,16 +15,20 @@ public class FriendNoteTagConfig extends Config { @ShowSettingInParent @SwitchSetting private final ConfigProperty enabled = new ConfigProperty<>(true); + @SpriteSlot(x = 7, y = 1) @SliderSetting(min = 5, max = 10) private final ConfigProperty size = new ConfigProperty<>(10); + @SpriteSlot(y = 2) @SwitchSetting private final ConfigProperty hideBackground = new ConfigProperty<>(false); + @SpriteSlot(x = 1, y = 2) @DropdownSetting private final ConfigProperty position = new ConfigProperty<>( PositionType.BELOW_NAME); + @SpriteSlot(x = 3) @TextFieldSetting private final ConfigProperty defaultTag = new ConfigProperty<>(""); @@ -32,15 +36,19 @@ public class FriendNoteTagConfig extends Config { public ConfigProperty enabled() { return this.enabled; } + public ConfigProperty size() { return this.size; } + public ConfigProperty hideBackground() { return this.hideBackground; } + public ConfigProperty position() { return this.position; } + public ConfigProperty defaultTag() { return this.defaultTag; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/PinIconConfig.java b/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/PinIconConfig.java index f2b813a..b16bc70 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/PinIconConfig.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/config/subconfig/PinIconConfig.java @@ -10,6 +10,7 @@ public class PinIconConfig extends Config { @SpriteSlot(x = 3) @SwitchSetting private final ConfigProperty pinIcon = new ConfigProperty<>(true); + @SpriteSlot(y = 1) @SwitchSetting private final ConfigProperty pinBadge = new ConfigProperty<>(true); @@ -17,6 +18,7 @@ public class PinIconConfig extends Config { public ConfigProperty pinIcon() { return this.pinIcon; } + public ConfigProperty pinBadge() { return this.pinBadge; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/interactions/BlockPlayerBullet.java b/core/src/main/java/com/rappytv/betterfriends/core/interactions/BlockPlayerBullet.java new file mode 100644 index 0000000..54f808d --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/interactions/BlockPlayerBullet.java @@ -0,0 +1,39 @@ +package com.rappytv.betterfriends.core.interactions; + +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; +import com.rappytv.betterfriends.core.BetterFriendsAddon; +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 BlockPlayerBullet implements BulletPoint { + + private final BetterFriendsAddon addon; + private final BlocklistManager manager = BetterFriendsAddon.references().blocklistManager(); + + public BlockPlayerBullet(BetterFriendsAddon addon) { + this.addon = addon; + } + + @Override + public Component getTitle() { + return Component.translatable("betterfriends.interactions.block"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + this.manager.block(player.getUniqueId(), player.getName()); + } + + @Override + public boolean isVisible(Player playerInfo) { + return this.addon.configuration().blocklist().showInteractionBullets().get() + && !this.manager.isBlocked(playerInfo.getUniqueId()); + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendNoteEditorBullet.java b/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendNoteEditorBullet.java index 26570db..3f724c5 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendNoteEditorBullet.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendNoteEditorBullet.java @@ -42,8 +42,8 @@ public boolean isVisible(Player player) { // if (!this.addon.configuration().enabled().get() || !this.addon.configuration().noteEditorBullet().get()) // return false; // -// LabyConnectSession session = Laby.references().labyConnect().getSession(); -// if (session == null || !session.isAuthenticated()) return false; +// LabyConnectSession session = BetterFriendsAddon.references().sessionHelper().getValidSession(); +// if (session == null) return false; // // Friend friend = session.getFriend(player.getUniqueId()); // if (friend == null) return false; diff --git a/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendTogglePinBullet.java b/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendTogglePinBullet.java index 9a4ebe1..946ecd4 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendTogglePinBullet.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/interactions/FriendTogglePinBullet.java @@ -1,13 +1,11 @@ package com.rappytv.betterfriends.core.interactions; import com.rappytv.betterfriends.core.BetterFriendsAddon; -import net.labymod.api.Laby; import net.labymod.api.Textures.SpriteCommon; 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; -import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.protocol.model.friend.Friend; public class FriendTogglePinBullet implements BulletPoint { @@ -43,10 +41,7 @@ public boolean isVisible(Player player) { if (!this.addon.configuration().enabled().get() || !this.addon.configuration().togglePinBullet().get()) return false; - LabyConnectSession session = Laby.references().labyConnect().getSession(); - if (session == null || !session.isAuthenticated()) return false; - - Friend friend = session.getFriend(player.getUniqueId()); + Friend friend = BetterFriendsAddon.references().sessionHelper().getFriend(player.getUniqueId()); if (friend == null) return false; this.friend = friend; diff --git a/core/src/main/java/com/rappytv/betterfriends/core/interactions/UnblockPlayerBullet.java b/core/src/main/java/com/rappytv/betterfriends/core/interactions/UnblockPlayerBullet.java new file mode 100644 index 0000000..ccd924a --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/interactions/UnblockPlayerBullet.java @@ -0,0 +1,39 @@ +package com.rappytv.betterfriends.core.interactions; + +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; +import com.rappytv.betterfriends.core.BetterFriendsAddon; +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 UnblockPlayerBullet implements BulletPoint { + + private final BetterFriendsAddon addon; + private final BlocklistManager manager = BetterFriendsAddon.references().blocklistManager(); + + public UnblockPlayerBullet(BetterFriendsAddon addon) { + this.addon = addon; + } + + @Override + public Component getTitle() { + return Component.translatable("betterfriends.interactions.unblock"); + } + + @Override + public Icon getIcon() { + return null; + } + + @Override + public void execute(Player player) { + this.manager.unblock(player.getUniqueId()); + } + + @Override + public boolean isVisible(Player playerInfo) { + return this.addon.configuration().blocklist().showInteractionBullets().get() + && this.manager.isBlocked(playerInfo.getUniqueId()); + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/listeners/ChatReceiveListener.java b/core/src/main/java/com/rappytv/betterfriends/core/listeners/ChatReceiveListener.java index b393679..db662d3 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/listeners/ChatReceiveListener.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/listeners/ChatReceiveListener.java @@ -2,13 +2,11 @@ import com.rappytv.betterfriends.core.BetterFriendsAddon; 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.component.serializer.legacy.LegacyComponentSerializer; import net.labymod.api.event.Subscribe; import net.labymod.api.event.client.chat.ChatReceiveEvent; -import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.protocol.model.friend.Friend; import net.labymod.api.loader.MinecraftVersions; @@ -37,12 +35,7 @@ public void onChatReceive(ChatReceiveEvent receiveEvent) { return; } - LabyConnectSession session = Laby.references().labyConnect().getSession(); - if (session == null || !session.isAuthenticated()) { - return; - } - - Friend friend = session.getFriend(uuid); + Friend friend = BetterFriendsAddon.references().sessionHelper().getFriend(uuid); if (friend == null) { return; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendListener.java b/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendListener.java index 45f6791..f1cc3ef 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendListener.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendListener.java @@ -36,7 +36,7 @@ public void onFriendAdd(LabyConnectFriendAddEvent event) { return; } - if (!Laby.labyAPI().addonService().isEnabled("voicechat")) { + if (!BetterFriendsAddon.isVoiceChatEnabled()) { return; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendRequestListener.java b/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendRequestListener.java index 398ddea..93f880a 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendRequestListener.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/listeners/FriendRequestListener.java @@ -1,6 +1,8 @@ package com.rappytv.betterfriends.core.listeners; +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; import com.rappytv.betterfriends.core.BetterFriendsAddon; +import com.rappytv.betterfriends.core.config.subconfig.BlocklistConfig; import com.rappytv.betterfriends.core.utils.GroupHelper; import net.labymod.api.Laby; import net.labymod.api.client.component.Component; @@ -11,7 +13,6 @@ import net.labymod.api.event.Subscribe; import net.labymod.api.event.labymod.labyconnect.session.request.LabyConnectIncomingFriendRequestAddEvent; import net.labymod.api.event.labymod.labyconnect.session.request.LabyConnectOutgoingFriendRequestRemoveEvent; -import net.labymod.api.labyconnect.LabyConnectSession; import net.labymod.api.labyconnect.protocol.model.request.IncomingFriendRequest; import net.labymod.api.notification.Notification; @@ -25,9 +26,6 @@ public FriendRequestListener(BetterFriendsAddon addon) { @Subscribe public void onFriendRequestReceive(LabyConnectIncomingFriendRequestAddEvent event) { - if(!this.addon.configuration().friendRequestNotifications().get()) { - return; - } IncomingFriendRequest request = event.request(); Component sender = GroupHelper.getColoredName(request.getName(), request.gameUser()) .hoverEvent(HoverEvent.showText(Component.translatable( @@ -38,30 +36,49 @@ public void onFriendRequestReceive(LabyConnectIncomingFriendRequestAddEvent even "https://laby.net/@" + request.getName() )); + BlocklistManager blocklistManager = BetterFriendsAddon.references().blocklistManager(); + BlocklistConfig blocklistConfig = this.addon.configuration().blocklist(); + if (blocklistConfig.declineFriendRequests().get() + && blocklistManager.isBlocked(request.getUniqueId())) { + request.decline(); + if (blocklistConfig.notifyOnFriendRequest().get()) { + BetterFriendsAddon.displayNotifications( + "betterfriends.blocklist.title", + Component.translatable( + "betterfriends.blocklist.blockedFriendRequest", + NamedTextColor.GRAY, + sender + ) + ); + } + return; + } + if (!this.addon.configuration().friendRequestNotifications().get()) { + return; + } + switch (this.addon.configuration().automaticFriendRequestReaction().get()) { case ACCEPT -> { request.accept(); - Laby.references().chatExecutor().displayClientMessage( - Component.empty() - .append(BetterFriendsAddon.getPrefix()) - .append(Component.translatable( - "betterfriends.notifications.friendRequest.automatedAction.accepted", - NamedTextColor.GREEN, - sender - )) + BetterFriendsAddon.displayNotifications( + "betterfriends.settings.automaticFriendRequestReaction.title", + Component.translatable( + "betterfriends.notifications.friendRequest.automatedAction.accepted", + NamedTextColor.GREEN, + sender + ) ); return; } case DECLINE -> { request.decline(); - Laby.references().chatExecutor().displayClientMessage( - Component.empty() - .append(BetterFriendsAddon.getPrefix()) - .append(Component.translatable( - "betterfriends.notifications.friendRequest.automatedAction.declined", - NamedTextColor.RED, - sender - )) + BetterFriendsAddon.displayNotifications( + "betterfriends.settings.automaticFriendRequestReaction.title", + Component.translatable( + "betterfriends.notifications.friendRequest.automatedAction.declined", + NamedTextColor.RED, + sender + ) ); return; } @@ -109,11 +126,10 @@ public void onFriendRequestRemove(LabyConnectOutgoingFriendRequestRemoveEvent ev if (!this.addon.configuration().friendRequestRemovalNotifications().get()) { return; } - LabyConnectSession session = event.labyConnect().getSession(); - if (session == null || !session.isAuthenticated()) { - return; - } - if (session.getFriend(event.request().getUniqueId()) != null) { + boolean isFriend = BetterFriendsAddon.references() + .sessionHelper() + .getFriend(event.request().getUniqueId()) != null; + if (isFriend) { return; } @@ -127,5 +143,4 @@ public void onFriendRequestRemove(LabyConnectOutgoingFriendRequestRemoveEvent ev .duration(15000) .buildAndPush(); } - } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/listeners/PlayerBlockListener.java b/core/src/main/java/com/rappytv/betterfriends/core/listeners/PlayerBlockListener.java new file mode 100644 index 0000000..2e26afb --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/listeners/PlayerBlockListener.java @@ -0,0 +1,83 @@ +package com.rappytv.betterfriends.core.listeners; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import com.rappytv.betterfriends.api.blocklist.event.BlockPlayerEvent; +import com.rappytv.betterfriends.api.blocklist.event.UnblockPlayerEvent; +import com.rappytv.betterfriends.core.BetterFriendsAddon; +import com.rappytv.betterfriends.core.config.subconfig.BlocklistConfig; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import net.labymod.addons.voicechat.core.VoiceChatAddon; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.component.format.NamedTextColor; +import net.labymod.api.event.Subscribe; +import net.labymod.api.labyconnect.protocol.model.friend.Friend; + +public class PlayerBlockListener { + + private final BlocklistConfig config; + + public PlayerBlockListener(BetterFriendsAddon addon) { + this.config = addon.configuration().blocklist(); + } + + @Subscribe + public void onBlock(BlockPlayerEvent event) { + this.updateConfig(); + BetterFriendsAddon.displayNotifications( + "betterfriends.blocklist.title", + Component.translatable( + "betterfriends.blocklist.blockedPlayer", + NamedTextColor.GRAY, + Component.text(event.player().username(), NamedTextColor.AQUA) + ) + ); + Friend friend = BetterFriendsAddon.references().sessionHelper() + .getFriend(event.player().uuid()); + if (this.config.unfriendBlockedPlayers().get() && friend != null) { + friend.remove(); + } + if (this.config.muteInVoiceChat().get() && BetterFriendsAddon.isVoiceChatEnabled()) { + this.setMuted(event.player().uuid(), true); + } + } + + @Subscribe + public void onUnblock(UnblockPlayerEvent event) { + this.updateConfig(); + BetterFriendsAddon.displayNotifications( + "betterfriends.blocklist.title", + Component.translatable( + "betterfriends.blocklist.unblockedPlayer", + NamedTextColor.GRAY, + Component.text(event.player().username(), NamedTextColor.AQUA) + ) + ); + if (this.config.muteInVoiceChat().get() && BetterFriendsAddon.isVoiceChatEnabled()) { + this.setMuted(event.player().uuid(), false); + } + } + + private void setMuted(UUID uuid, boolean value) { + Map volumes = VoiceChatAddon.INSTANCE + .configuration() + .playerVolumes() + .get(); + + boolean alreadyMuted = volumes.getOrDefault(uuid, 1f) == 0; + if (value && !alreadyMuted) { + volumes.put(uuid, 0f); + } else { + if (alreadyMuted) { + volumes.put(uuid, 1f); + } + } + } + + private void updateConfig() { + List blockedPlayers = this.config.blockedPlayers(); + blockedPlayers.clear(); + blockedPlayers.addAll(BetterFriendsAddon.references().blocklistManager().getBlockedPlayers()); + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/listeners/TemporaryPinListener.java b/core/src/main/java/com/rappytv/betterfriends/core/listeners/TemporaryPinListener.java index 3cca8c8..0fed528 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/listeners/TemporaryPinListener.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/listeners/TemporaryPinListener.java @@ -27,8 +27,8 @@ public void onLabyConnect(LabyConnectEvent event) { return; } - LabyConnectSession session = connect.getSession(); - if (session == null || !session.isAuthenticated()) { + LabyConnectSession session = BetterFriendsAddon.references().sessionHelper().getValidSession(); + if (session == null) { return; } @@ -63,13 +63,9 @@ public void onLabyConnectChatMessage(LabyConnectChatMessageEvent event) { if (!this.config.temporaryPinsEnabled().get()) { return; } - LabyConnectSession session = event.labyConnect().getSession(); - if (session == null || !session.isAuthenticated()) { - return; - } UUID uniqueId = event.message().sender().getUniqueId(); - Friend friend = session.getFriend(uniqueId); + Friend friend = BetterFriendsAddon.references().sessionHelper().getFriend(uniqueId); if (friend == null || friend.isPinned()) { return; } @@ -89,12 +85,7 @@ public void onLabyConnectChatMessageRead(LabyConnectChatMessageReadEvent event) return; } - LabyConnectSession session = event.labyConnect().getSession(); - if (session == null || !session.isAuthenticated()) { - return; - } - - Friend friend = session.getFriend(uniqueId); + Friend friend = BetterFriendsAddon.references().sessionHelper().getFriend(uniqueId); if (friend == null || !friend.isPinned()) { return; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/activity/config/BlocklistActivity.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/activity/config/BlocklistActivity.java new file mode 100644 index 0000000..79790d8 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/activity/config/BlocklistActivity.java @@ -0,0 +1,86 @@ +package com.rappytv.betterfriends.core.ui.activity.config; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; +import com.rappytv.betterfriends.api.blocklist.event.BlockPlayerEvent; +import com.rappytv.betterfriends.api.blocklist.event.UnblockPlayerEvent; +import com.rappytv.betterfriends.core.BetterFriendsAddon; +import com.rappytv.betterfriends.core.ui.widget.config.BlockedPlayerWidget; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import net.labymod.api.client.component.Component; +import net.labymod.api.client.gui.screen.Parent; +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.widgets.ComponentWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.ScrollWidget; +import net.labymod.api.client.gui.screen.widget.widgets.layout.list.VerticalListWidget; +import net.labymod.api.event.Subscribe; + +@AutoActivity +@Link("blocklist.lss") +public class BlocklistActivity extends SimpleActivity { + + private static final Component EMPTY_LABEL = Component.translatable( + "betterfriends.blocklist.empty"); + private static final Component HINT_LABEL = Component.translatable( + "betterfriends.blocklist.hint"); + + private final Map playerWidgets = new HashMap<>(); + private final VerticalListWidget participantList; + private final BlocklistManager manager = BetterFriendsAddon.references().blocklistManager(); + + public BlocklistActivity() { + this.loadParticipants(); + this.participantList = new VerticalListWidget<>().addId("player-list"); + this.participantList.setComparator(BlockedPlayerWidget::compare); + } + + @Override + public void initialize(Parent parent) { + super.initialize(parent); + + Map widgets = this.playerWidgets; + if (widgets.isEmpty()) { + VerticalListWidget infoComponents = new VerticalListWidget<>(); + infoComponents.addId("info-components"); + infoComponents.addChild(ComponentWidget.component(EMPTY_LABEL).addId("empty-label")); + infoComponents.addChild(ComponentWidget.component(HINT_LABEL).addId("hint-label")); + this.document.addChild(infoComponents); + return; + } + for (BlockedPlayerWidget playerWidget : widgets.values()) { + this.participantList.addChild(playerWidget); + } + + this.document.addChild(new ScrollWidget(this.participantList)); + } + + @Override + public void reload() { + this.loadParticipants(); + super.reload(); + } + + @Subscribe + public void onBlock(BlockPlayerEvent event) { + this.reload(); + } + + @Subscribe + public void onBlock(UnblockPlayerEvent event) { + this.reload(); + } + + private void loadParticipants() { + this.playerWidgets.clear(); + for (BlockedPlayer player : this.manager.getBlockedPlayers()) { + this.playerWidgets.put( + player.uuid(), + new BlockedPlayerWidget(player) + ); + } + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/badge/FriendPinBadge.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/badge/FriendPinBadge.java index 881e9fa..96421e3 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/badge/FriendPinBadge.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/badge/FriendPinBadge.java @@ -26,7 +26,7 @@ protected boolean isVisible(NetworkPlayerInfo player) { || !this.addon.configuration().pinIconConfig().pinBadge().get()) { return false; } - Friend friend = BetterFriendsAddon.references().friendHelper().getFriend(player.profile()); + Friend friend = BetterFriendsAddon.references().sessionHelper().getFriend(player.profile()); return friend != null && friend.isPinned(); } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/FriendCountHudWidget.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/FriendCountHudWidget.java index 09b5012..db0ab28 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/FriendCountHudWidget.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/FriendCountHudWidget.java @@ -1,6 +1,6 @@ package com.rappytv.betterfriends.core.ui.hud; -import net.labymod.api.Laby; +import com.rappytv.betterfriends.core.BetterFriendsAddon; import net.labymod.api.client.component.Component; import net.labymod.api.client.gui.hud.binding.category.HudWidgetCategory; import net.labymod.api.client.gui.hud.hudwidget.text.TextHudWidget; @@ -44,8 +44,10 @@ public void onTick(boolean isEditorContext) { @Override public boolean isVisibleInGame() { - LabyConnectSession session = Laby.references().labyConnect().getSession(); - if(session == null || !session.isAuthenticated()) return false; + LabyConnectSession session = BetterFriendsAddon.references().sessionHelper().getValidSession(); + if (session == null) { + return false; + } if(session.getFriends().size() != this.friendCount) this.friendCount = session.getFriends().size(); return true; diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/IncomingFriendRequestCountHudWidget.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/IncomingFriendRequestCountHudWidget.java index 8fa2a19..38e9768 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/IncomingFriendRequestCountHudWidget.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/IncomingFriendRequestCountHudWidget.java @@ -1,6 +1,6 @@ package com.rappytv.betterfriends.core.ui.hud; -import net.labymod.api.Laby; +import com.rappytv.betterfriends.core.BetterFriendsAddon; import net.labymod.api.Textures.SpriteCommon; import net.labymod.api.client.component.Component; import net.labymod.api.client.gui.hud.binding.category.HudWidgetCategory; @@ -39,8 +39,10 @@ public void onTick(boolean isEditorContext) { @Override public boolean isVisibleInGame() { - LabyConnectSession session = Laby.references().labyConnect().getSession(); - if(session == null || !session.isAuthenticated()) return false; + LabyConnectSession session = BetterFriendsAddon.references().sessionHelper().getValidSession(); + if (session == null) { + return false; + } if(session.getIncomingRequests().size() != this.requests) this.requests = session.getIncomingRequests().size(); return this.requests > 0; diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/OnlineFriendCountHudWidget.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/OnlineFriendCountHudWidget.java index 0aa7b3a..8e7cc36 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/OnlineFriendCountHudWidget.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/OnlineFriendCountHudWidget.java @@ -1,6 +1,6 @@ package com.rappytv.betterfriends.core.ui.hud; -import net.labymod.api.Laby; +import com.rappytv.betterfriends.core.BetterFriendsAddon; import net.labymod.api.Textures.SpriteCommon; import net.labymod.api.client.component.Component; import net.labymod.api.client.gui.hud.binding.category.HudWidgetCategory; @@ -39,8 +39,10 @@ public void onTick(boolean isEditorContext) { @Override public boolean isVisibleInGame() { - LabyConnectSession session = Laby.references().labyConnect().getSession(); - if(session == null || !session.isAuthenticated()) return false; + LabyConnectSession session = BetterFriendsAddon.references().sessionHelper().getValidSession(); + if (session == null) { + return false; + } if(session.getOnlineFriendCount() != this.friendCount) this.friendCount = session.getOnlineFriendCount(); return true; diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/UnreadChatCountWidget.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/UnreadChatCountWidget.java index 7cd60e9..0980a69 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/UnreadChatCountWidget.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/hud/UnreadChatCountWidget.java @@ -1,6 +1,6 @@ package com.rappytv.betterfriends.core.ui.hud; -import net.labymod.api.Laby; +import com.rappytv.betterfriends.core.BetterFriendsAddon; import net.labymod.api.Textures.SpriteCommon; import net.labymod.api.client.component.Component; import net.labymod.api.client.gui.hud.binding.category.HudWidgetCategory; @@ -39,8 +39,10 @@ public void onTick(boolean isEditorContext) { @Override public boolean isVisibleInGame() { - LabyConnectSession session = Laby.references().labyConnect().getSession(); - if(session == null || !session.isAuthenticated()) return false; + LabyConnectSession session = BetterFriendsAddon.references().sessionHelper().getValidSession(); + if (session == null) { + return false; + } if(session.getUnreadCount() != this.unread) this.unread = session.getUnreadCount(); return this.unread > 0; } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsFriendSnapshot.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsFriendSnapshot.java deleted file mode 100644 index 760665d..0000000 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsFriendSnapshot.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.rappytv.betterfriends.core.ui.snapshot; - -import com.rappytv.betterfriends.core.BetterFriendsAddon; -import com.rappytv.betterfriends.core.config.BetterFriendsConfig; -import net.labymod.api.client.entity.player.Player; -import net.labymod.api.laby3d.renderer.snapshot.AbstractLabySnapshot; -import net.labymod.api.laby3d.renderer.snapshot.Extras; -import net.labymod.api.labyconnect.protocol.model.friend.Friend; -import org.jetbrains.annotations.Nullable; - -public class BetterFriendsFriendSnapshot extends AbstractLabySnapshot { - - private final Friend friend; - private final BetterFriendsConfig config; - - public BetterFriendsFriendSnapshot(Player player, Extras extras, BetterFriendsAddon addon) { - super(extras); - this.friend = BetterFriendsAddon.references().friendHelper().getFriend(player.profile()); - this.config = addon.configuration(); - } - - @Nullable - public Friend friend() { - return this.friend; - } - - public BetterFriendsConfig config() { - return this.config; - } -} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsKeys.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsKeys.java index 0adb7c8..c8fbbfa 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsKeys.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsKeys.java @@ -4,6 +4,8 @@ public class BetterFriendsKeys { - public static final ExtraKey FRIEND = ExtraKey.of( - "better_friends_friend", BetterFriendsFriendSnapshot.class); + public static final ExtraKey PLAYER = ExtraKey.of( + "better_friends_player", BetterFriendsPlayerSnapshot.class); + public static final ExtraKey FRIEND_NOTE = ExtraKey.of( + "friend_note", FriendNoteSnapshot.class); } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsPlayerSnapshot.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsPlayerSnapshot.java new file mode 100644 index 0000000..878a96a --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsPlayerSnapshot.java @@ -0,0 +1,50 @@ +package com.rappytv.betterfriends.core.ui.snapshot; + +import com.rappytv.betterfriends.core.BetterFriendsAddon; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.laby3d.renderer.snapshot.AbstractLabySnapshot; +import net.labymod.api.laby3d.renderer.snapshot.Extras; +import net.labymod.api.labyconnect.protocol.model.friend.Friend; +import org.jetbrains.annotations.Nullable; + +public class BetterFriendsPlayerSnapshot extends AbstractLabySnapshot { + + private final Friend friend; + private final boolean blocked; + private final boolean addonEnabled; + private final boolean pinIconEnabled; + private final boolean blockIconEnabled; + + public BetterFriendsPlayerSnapshot(Player player, Extras extras, BetterFriendsAddon addon) { + super(extras); + this.friend = BetterFriendsAddon.references().sessionHelper().getFriend(player.profile()); + this.blocked = BetterFriendsAddon.references() + .blocklistManager() + .isBlocked(player.getUniqueId()); + this.addonEnabled = addon.configuration().enabled().get(); + this.pinIconEnabled = addon.configuration().pinIconConfig().pinIcon().get(); + this.blockIconEnabled = addon.configuration().blocklist().showBlockIcon().get(); + } + + @Nullable + public Friend friend() { + return this.friend; + } + + public boolean isBlocked() { + return this.blocked; + } + + public boolean isAddonEnabled() { + return this.addonEnabled; + } + + public boolean isPinIconEnabled() { + return this.pinIconEnabled; + } + + public boolean isBlockIconEnabled() { + return this.blockIconEnabled; + } + +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsFriendSnapshotProcessor.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsPlayerSnapshotProcessor.java similarity index 76% rename from core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsFriendSnapshotProcessor.java rename to core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsPlayerSnapshotProcessor.java index f9075c3..c088a89 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsFriendSnapshotProcessor.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsPlayerSnapshotProcessor.java @@ -8,9 +8,9 @@ import net.labymod.api.service.annotation.AutoService; @AutoService(EntitySnapshotProcessor.class) -public class BetterFriendsFriendSnapshotProcessor extends EntitySnapshotProcessor { +public class BetterFriendsPlayerSnapshotProcessor extends EntitySnapshotProcessor { - public BetterFriendsFriendSnapshotProcessor(EntitySnapshotRegistry registry) { + public BetterFriendsPlayerSnapshotProcessor(EntitySnapshotRegistry registry) { super(registry); } @@ -21,6 +21,7 @@ public boolean supports(Entity entity) { @Override public void process(Player player, float partialTicks, ExtrasWriter entityWriter) { - this.registry().captureSnapshot(entityWriter, BetterFriendsKeys.FRIEND, player); + this.registry().captureSnapshot(entityWriter, BetterFriendsKeys.PLAYER, player); + this.registry().captureSnapshot(entityWriter, BetterFriendsKeys.FRIEND_NOTE, player); } } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsSnapshotFactory.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsSnapshotFactory.java index d547a00..c632c1e 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsSnapshotFactory.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/BetterFriendsSnapshotFactory.java @@ -8,17 +8,17 @@ @AutoService(LabySnapshotFactory.class) public class BetterFriendsSnapshotFactory extends - LabySnapshotFactory { + LabySnapshotFactory { private final BetterFriendsAddon addon; public BetterFriendsSnapshotFactory(BetterFriendsAddon addon) { - super(BetterFriendsKeys.FRIEND); + super(BetterFriendsKeys.PLAYER); this.addon = addon; } @Override - protected BetterFriendsFriendSnapshot create(Player player, Extras extras) { - return new BetterFriendsFriendSnapshot(player, extras, this.addon); + protected BetterFriendsPlayerSnapshot create(Player player, Extras extras) { + return new BetterFriendsPlayerSnapshot(player, extras, this.addon); } } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/FriendNoteSnapshot.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/FriendNoteSnapshot.java new file mode 100644 index 0000000..17655d8 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/FriendNoteSnapshot.java @@ -0,0 +1,72 @@ +package com.rappytv.betterfriends.core.ui.snapshot; + +import com.rappytv.betterfriends.core.BetterFriendsAddon; +import com.rappytv.betterfriends.core.config.subconfig.FriendNoteTagConfig; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.client.entity.player.tag.PositionType; +import net.labymod.api.laby3d.renderer.snapshot.AbstractLabySnapshot; +import net.labymod.api.laby3d.renderer.snapshot.Extras; +import net.labymod.api.labyconnect.protocol.model.friend.Friend; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class FriendNoteSnapshot extends AbstractLabySnapshot { + + private final boolean addonEnabled; + private final boolean tagEnabled; + private final boolean hideBackground; + private final boolean friend; + private final float scale; + private final PositionType position; + private final String defaultTag; + private final String note; + + public FriendNoteSnapshot(Player player, Extras extras, BetterFriendsAddon addon) { + super(extras); + FriendNoteTagConfig config = addon.configuration().friendNoteTagConfig(); + Friend friend = BetterFriendsAddon.references().sessionHelper().getFriend(player.getUniqueId()); + this.addonEnabled = addon.configuration().enabled().get(); + this.tagEnabled = config.enabled().get(); + this.hideBackground = config.hideBackground().get(); + this.friend = friend != null; + this.scale = config.size().get() / 10f; + this.position = config.position().get(); + this.defaultTag = config.defaultTag().get(); + this.note = this.friend ? friend.getNote() : null; + } + + public boolean isAddonEnabled() { + return this.addonEnabled; + } + + public boolean isTagEnabled() { + return this.tagEnabled; + } + + public boolean shouldHideBackground() { + return this.hideBackground; + } + + public boolean isFriend() { + return this.friend; + } + + public float getScale() { + return this.scale; + } + + @NotNull + public PositionType getPosition() { + return this.position; + } + + @NotNull + public String getDefaultTag() { + return this.defaultTag; + } + + @Nullable + public String getNote() { + return this.note; + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/FriendNoteSnapshotFactory.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/FriendNoteSnapshotFactory.java new file mode 100644 index 0000000..24db469 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/snapshot/FriendNoteSnapshotFactory.java @@ -0,0 +1,24 @@ +package com.rappytv.betterfriends.core.ui.snapshot; + +import com.rappytv.betterfriends.core.BetterFriendsAddon; +import net.labymod.api.client.entity.player.Player; +import net.labymod.api.laby3d.renderer.snapshot.Extras; +import net.labymod.api.laby3d.renderer.snapshot.LabySnapshotFactory; +import net.labymod.api.service.annotation.AutoService; + +@AutoService(LabySnapshotFactory.class) +public class FriendNoteSnapshotFactory extends + LabySnapshotFactory { + + private final BetterFriendsAddon addon; + + public FriendNoteSnapshotFactory(BetterFriendsAddon addon) { + super(BetterFriendsKeys.FRIEND_NOTE); + this.addon = addon; + } + + @Override + protected FriendNoteSnapshot create(Player player, Extras extras) { + return new FriendNoteSnapshot(player, extras, this.addon); + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/BlockedPlayerIconTag.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/BlockedPlayerIconTag.java new file mode 100644 index 0000000..c0db9e2 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/BlockedPlayerIconTag.java @@ -0,0 +1,28 @@ +package com.rappytv.betterfriends.core.ui.tags; + +import com.rappytv.betterfriends.api.ui.BetterFriendsTextures; +import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsKeys; +import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsPlayerSnapshot; +import net.labymod.api.client.entity.player.tag.tags.IconTag; + +public class BlockedPlayerIconTag extends IconTag { + + public BlockedPlayerIconTag() { + super(BetterFriendsTextures.BLOCKED, 8); + } + + @Override + public boolean isVisible() { + if (!this.snapshot.has(BetterFriendsKeys.PLAYER)) { + return false; + } + BetterFriendsPlayerSnapshot playerSnapshot = this.snapshot.get(BetterFriendsKeys.PLAYER); + + return super.isVisible() + && !this.snapshot.isDiscrete() + && !this.snapshot.isInvisible() + && playerSnapshot.isAddonEnabled() + && playerSnapshot.isBlocked() + && playerSnapshot.isBlockIconEnabled(); + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendNoteNameTag.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendNoteNameTag.java index d357ceb..9afb1a4 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendNoteNameTag.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendNoteNameTag.java @@ -1,8 +1,7 @@ package com.rappytv.betterfriends.core.ui.tags; -import com.rappytv.betterfriends.core.BetterFriendsAddon; -import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsFriendSnapshot; import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsKeys; +import com.rappytv.betterfriends.core.ui.snapshot.FriendNoteSnapshot; import java.util.Collections; import java.util.List; import net.labymod.api.client.component.Component; @@ -10,65 +9,68 @@ import net.labymod.api.client.entity.player.tag.PositionType; import net.labymod.api.client.entity.player.tag.tags.ComponentNameTag; import net.labymod.api.client.render.state.entity.EntitySnapshot; -import net.labymod.api.labyconnect.protocol.model.friend.Friend; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class FriendNoteNameTag extends ComponentNameTag { - private final BetterFriendsAddon addon; private final PositionType position; private final LegacyComponentSerializer serializer = LegacyComponentSerializer.legacyAmpersand(); - public FriendNoteNameTag(BetterFriendsAddon addon, PositionType position) { - this.addon = addon; + public FriendNoteNameTag(PositionType position) { this.position = position; } @Override protected @NotNull List buildComponents(EntitySnapshot snapshot) { + Component note = this.getNote(snapshot); + if (note == null) { + return super.buildComponents(snapshot); + } + return Collections.singletonList(note); + } + + @Nullable + private Component getNote(EntitySnapshot snapshot) { if (this.snapshot.isDiscrete() || this.snapshot.isInvisible() - || !this.snapshot.has(BetterFriendsKeys.FRIEND)) { - return super.buildComponents(snapshot); + || !this.snapshot.has(BetterFriendsKeys.FRIEND_NOTE)) { + return null; } - BetterFriendsFriendSnapshot friendSnapshot = snapshot.get(BetterFriendsKeys.FRIEND); + FriendNoteSnapshot noteSnapshot = snapshot.get(BetterFriendsKeys.FRIEND_NOTE); - boolean condition = friendSnapshot.config().enabled().get() - && friendSnapshot.config().friendNoteTagConfig().enabled().get() - && friendSnapshot.config().friendNoteTagConfig().position().get() == this.position; + boolean condition = noteSnapshot.isAddonEnabled() + && noteSnapshot.isTagEnabled() + && noteSnapshot.getPosition() == this.position + && noteSnapshot.isFriend(); if (!condition) { - return super.buildComponents(snapshot); + return null; } - Friend friend = friendSnapshot.friend(); - if (friend == null) { - return super.buildComponents(snapshot); - } - String note = friend.getNote(); - if (note != null && !note.isBlank()) { - return Collections.singletonList(this.serializer.deserialize(note)); + String note = noteSnapshot.getNote(); + String tag = note != null && !note.isBlank() ? note : noteSnapshot.getDefaultTag(); + if (tag.isBlank()) { + return null; } - String defaultTag = friendSnapshot.config().friendNoteTagConfig().defaultTag().get(); - if (defaultTag.isBlank()) { - return super.buildComponents(snapshot); - } - return Collections.singletonList(this.serializer.deserialize(defaultTag)); + return this.serializer.deserialize(tag); } @Override protected int getBackgroundColor(EntitySnapshot snapshot) { - BetterFriendsFriendSnapshot friendSnapshot = snapshot.get(BetterFriendsKeys.FRIEND); - if (friendSnapshot == null) { + FriendNoteSnapshot noteSnapshot = snapshot.get(BetterFriendsKeys.FRIEND_NOTE); + if (noteSnapshot == null) { return super.getBackgroundColor(snapshot); } - return friendSnapshot.config().friendNoteTagConfig().hideBackground().get() - ? 0 - : super.getBackgroundColor(snapshot); + return noteSnapshot.shouldHideBackground() ? 0 : super.getBackgroundColor(snapshot); } @Override public float getScale() { - return (float) this.addon.configuration().friendNoteTagConfig().size().get() / 10; + FriendNoteSnapshot noteSnapshot = this.snapshot.get(BetterFriendsKeys.FRIEND_NOTE); + if (noteSnapshot == null) { + return super.getScale(); + } + return noteSnapshot.getScale(); } } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendPinIconTag.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendPinIconTag.java index 2daa403..e23d20a 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendPinIconTag.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/tags/FriendPinIconTag.java @@ -1,7 +1,7 @@ package com.rappytv.betterfriends.core.ui.tags; -import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsFriendSnapshot; import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsKeys; +import com.rappytv.betterfriends.core.ui.snapshot.BetterFriendsPlayerSnapshot; import net.labymod.api.Textures; import net.labymod.api.client.entity.player.tag.tags.IconTag; import net.labymod.api.labyconnect.protocol.model.friend.Friend; @@ -14,17 +14,17 @@ public FriendPinIconTag() { @Override public boolean isVisible() { - if (!this.snapshot.has(BetterFriendsKeys.FRIEND)) { + if (!this.snapshot.has(BetterFriendsKeys.PLAYER)) { return false; } - BetterFriendsFriendSnapshot friendSnapshot = this.snapshot.get(BetterFriendsKeys.FRIEND); + BetterFriendsPlayerSnapshot playerSnapshot = this.snapshot.get(BetterFriendsKeys.PLAYER); - Friend friend = friendSnapshot.friend(); + Friend friend = playerSnapshot.friend(); return super.isVisible() && !this.snapshot.isDiscrete() && !this.snapshot.isInvisible() - && friendSnapshot.config().enabled().get() - && friendSnapshot.config().pinIconConfig().pinIcon().get() + && playerSnapshot.isAddonEnabled() + && playerSnapshot.isPinIconEnabled() && friend != null && friend.isPinned(); } diff --git a/core/src/main/java/com/rappytv/betterfriends/core/ui/widget/config/BlockedPlayerWidget.java b/core/src/main/java/com/rappytv/betterfriends/core/ui/widget/config/BlockedPlayerWidget.java new file mode 100644 index 0000000..0078c31 --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/ui/widget/config/BlockedPlayerWidget.java @@ -0,0 +1,62 @@ +package com.rappytv.betterfriends.core.ui.widget.config; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; +import com.rappytv.betterfriends.core.BetterFriendsAddon; +import java.util.UUID; +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.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.layout.list.HorizontalListWidget; +import net.labymod.api.client.gui.screen.widget.widgets.renderer.IconWidget; + +@AutoWidget +public class BlockedPlayerWidget extends HorizontalListWidget { + + private final BlockedPlayer player; + private final BlocklistManager manager = BetterFriendsAddon.references().blocklistManager(); + + public BlockedPlayerWidget(BlockedPlayer player) { + this.player = player; + } + + @Override + public void initialize(Parent parent) { + super.initialize(parent); + + IconWidget iconWidget = new IconWidget(this.getIconWidget(this.player.uuid())) + .addId("avatar"); + this.addEntry(iconWidget); + + ComponentWidget nameWidget = ComponentWidget.text(this.player.username()) + .addId("username"); + this.addEntry(nameWidget); + + ButtonWidget removeButtonWidget = ButtonWidget.text("✘", () -> + this.manager.unblock(this.player.uuid()) + ).addId("remove-button"); + this.addEntry(removeButtonWidget); + } + + private Icon getIconWidget(UUID uuid) { + return Icon.head(uuid); + } + + @Override + public int getSortingValue() { + return -1; + } + + public static int compare(Widget a, Widget b) { + if (!(a instanceof BlockedPlayerWidget p1) + || !(b instanceof BlockedPlayerWidget p2)) { + return 0; + } + + return p1.player.username().compareToIgnoreCase(p2.player.username()); + } + +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultBlocklistManager.java b/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultBlocklistManager.java new file mode 100644 index 0000000..b1b5dcb --- /dev/null +++ b/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultBlocklistManager.java @@ -0,0 +1,56 @@ +package com.rappytv.betterfriends.core.utils; + +import com.rappytv.betterfriends.api.blocklist.BlockedPlayer; +import com.rappytv.betterfriends.api.blocklist.BlocklistManager; +import com.rappytv.betterfriends.api.blocklist.event.BlockPlayerEvent; +import com.rappytv.betterfriends.api.blocklist.event.UnblockPlayerEvent; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import javax.inject.Singleton; +import net.labymod.api.Laby; +import net.labymod.api.models.Implements; + +@Singleton +@Implements(BlocklistManager.class) +public class DefaultBlocklistManager implements BlocklistManager { + + private final Map blockedPlayers = new HashMap<>(); + + @Override + public boolean isBlocked(UUID uuid) { + return this.blockedPlayers.containsKey(uuid); + } + + @Override + public List getBlockedPlayers() { + return List.copyOf(this.blockedPlayers.values()); + } + + @Override + public void loadBlocklist(List players) { + if (!this.blockedPlayers.isEmpty()) { + throw new IllegalStateException("Blocked players are already initialized"); + } + for (BlockedPlayer player : players) { + this.blockedPlayers.put(player.uuid(), player); + } + } + + @Override + public void block(UUID uuid, String username) { + this.block(new BlockedPlayer(uuid, username)); + } + + @Override + public void block(BlockedPlayer player) { + this.blockedPlayers.put(player.uuid(), player); + Laby.fireEvent(new BlockPlayerEvent(player)); + } + + @Override + public void unblock(UUID uuid) { + Laby.fireEvent(new UnblockPlayerEvent(this.blockedPlayers.remove(uuid))); + } +} diff --git a/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultFriendHelper.java b/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultSessionHelper.java similarity index 61% rename from core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultFriendHelper.java rename to core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultSessionHelper.java index 78c65c1..643773d 100644 --- a/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultFriendHelper.java +++ b/core/src/main/java/com/rappytv/betterfriends/core/utils/DefaultSessionHelper.java @@ -1,6 +1,6 @@ package com.rappytv.betterfriends.core.utils; -import com.rappytv.betterfriends.api.FriendHelper; +import com.rappytv.betterfriends.api.SessionHelper; import java.util.UUID; import javax.inject.Singleton; import net.labymod.api.Laby; @@ -10,8 +10,17 @@ import org.jetbrains.annotations.Nullable; @Singleton -@Implements(FriendHelper.class) -public class DefaultFriendHelper implements FriendHelper { +@Implements(SessionHelper.class) +public class DefaultSessionHelper implements SessionHelper { + + @Override + public LabyConnectSession getValidSession() { + LabyConnectSession session = Laby.labyAPI().labyConnect().getSession(); + if (session == null || !session.isAuthenticated()) { + return null; + } + return session; + } @Override @Nullable diff --git a/core/src/main/resources/assets/betterfriends/i18n/en_us.json b/core/src/main/resources/assets/betterfriends/i18n/en_us.json index 3fe4c5a..ae661f8 100644 --- a/core/src/main/resources/assets/betterfriends/i18n/en_us.json +++ b/core/src/main/resources/assets/betterfriends/i18n/en_us.json @@ -86,12 +86,42 @@ "name": "Friend prefix in chat", "description": "This will be prepended to friend messages. You can leave this empty to disable." }, + "blocklist": { + "header": { + "behavior": { + "name": "Blocking behavior" + } + }, + "name": "Blocklist", + "menu": { + "name": "Manage blocked players" + }, + "showInteractionBullets": { + "name": "Show interaction bullets" + }, + "showBlockIcon": { + "name": "Show icon next to blocked players" + }, + "unfriendBlockedPlayers": { + "name": "Remove player from friend list when blocking them" + }, + "muteInVoiceChat": { + "name": "Mute player in VoiceChat when blocking them" + }, + "declineFriendRequests": { + "name": "Decline friend requests automatically" + }, + "notifyOnFriendRequest": { + "name": "Show chat message when blocked player sends a friend request" + } + }, "friendRequestNotifications": { "name": "Friend requests", "description": "If you want to receive chat messages when you receive a friend request." }, "automaticFriendRequestReaction": { "name": "Automatic friend request reaction", + "title": "Friend request", "description": "With this option you can set an automatic reaction to incoming friend requests. You will still be notified about any incoming friend requests and if they were accepted/denied automatically.", "entries": { "none": "None", @@ -112,7 +142,7 @@ "description": "Note that this will also notify you when you remove them from your friend list as there is no way to check who was performing the action." }, "friendRequestRemovalNotifications": { - "name": "Friend declines your friend request", + "name": "Player declines your friend request", "description": "Note that this will also notify you when you cancel the friend request as there is no way to check who was performing the action." }, "labyChatMessageNotifications": { @@ -174,6 +204,14 @@ }, "command": { "usage": "Usage: %s", + "block": { + "title": "Blocklist", + "enterName": "Please enter a username!", + "playerNotFound": "Player not found. Make sure they are around you!", + "alreadyBlocked": "This player is already blocked!", + "notBlocked": "This player is not blocked!", + "cantBlockSelf": "You cannot block yourself!" + }, "requests": { "notFound": "Unknown friend request!", "enterName": "Please provide a valid username!", @@ -197,6 +235,13 @@ "notFound": "Player not found!" } }, + "blocklist": { + "empty": "Blocklist is empty", + "hint": "Hint: You can block players with /bf block or via the interaction menu", + "blockedFriendRequest": "Blocked player %s sent a friend request which was automatically declined.", + "blockedPlayer": "You blocked %s!", + "unblockedPlayer": "You unblocked %s!" + }, "notifications": { "friendRemoval": { "title": "Friend removed!", @@ -232,6 +277,8 @@ } }, "interactions": { + "block": "Block player", + "unblock": "Unblock player", "editNote": { "title": "Edit friend note" }, diff --git a/core/src/main/resources/assets/betterfriends/textures/blocked.png b/core/src/main/resources/assets/betterfriends/textures/blocked.png new file mode 100644 index 0000000..7dc930b Binary files /dev/null and b/core/src/main/resources/assets/betterfriends/textures/blocked.png differ diff --git a/core/src/main/resources/assets/betterfriends/textures/icon.png b/core/src/main/resources/assets/betterfriends/textures/icon.png index 66e98c1..bf773a1 100644 Binary files a/core/src/main/resources/assets/betterfriends/textures/icon.png and b/core/src/main/resources/assets/betterfriends/textures/icon.png differ diff --git a/core/src/main/resources/assets/betterfriends/themes/vanilla/lss/blocklist.lss b/core/src/main/resources/assets/betterfriends/themes/vanilla/lss/blocklist.lss new file mode 100644 index 0000000..3cb85a4 --- /dev/null +++ b/core/src/main/resources/assets/betterfriends/themes/vanilla/lss/blocklist.lss @@ -0,0 +1,57 @@ +.info-components { + width: 100%; + height: fit-content; + top: 35%; + space-between-entries: 5; + + Component { + alignment-x: center; + + &.empty-label { + text-color: blue; + } + + &.hint-label { + text-color: dark_gray; + } + } +} + +Scroll { + width: 100%; + height: 100%; + + .player-list { + width: 100%; + height: 100%; + + BlockedPlayer { + width: 100%; + height: 20; + padding: 1; + + .avatar { + width: 16; + height: width; + margin: 0 3 0 3; + } + + .remove-button { + padding: 0; + height: 20; + width: height; + alignment: right; + + Component { + text-color: white !important; + } + + &:hover { + Component { + text-color: red !important; + } + } + } + } + } +} \ No newline at end of file diff --git a/core/src/main/resources/assets/betterfriends/themes/vanilla/textures/settings.png b/core/src/main/resources/assets/betterfriends/themes/vanilla/textures/settings.png index c9b163e..0564716 100644 Binary files a/core/src/main/resources/assets/betterfriends/themes/vanilla/textures/settings.png and b/core/src/main/resources/assets/betterfriends/themes/vanilla/textures/settings.png differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b3c9c..959002e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=2ab2958f2a1e51120c326cad6f385153bb11ee93b3c216c5fccebfdfbb7ec6cb +distributionSha256Sum=553c78f50dafcd54d65b9a444649057857469edf836431389695608536d6b746 diff --git a/settings.gradle.kts b/settings.gradle.kts index 6e38e19..7ae59ef 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,10 +1,10 @@ rootProject.name = "betterfriends" pluginManagement { - val labyGradlePluginVersion = "0.6.2" + val labyGradlePluginVersion = "0.8.1" buildscript { repositories { - maven("https://dist.labymod.net/api/v1/maven/release/") + maven("https://maven.laby.net/api/v1/maven/release/") maven("https://maven.neoforged.net/releases/") maven("https://maven.fabricmc.net/") gradlePluginPortal()