From a182d8c38b44869b82e261c89ccac964a1f41dd4 Mon Sep 17 00:00:00 2001 From: Vinrobot Date: Tue, 20 Jun 2023 21:32:42 +0200 Subject: [PATCH] Split emote loading into different emote provider --- .../client/MinecraftEmoteModClient.java | 71 +++++++------------ .../providers/FFZRoomEmoteProvider.java | 26 +++++++ .../client/providers/IEmoteProvider.java | 5 ++ .../client/providers/IEmoteRegistry.java | 7 ++ .../providers/STVGlobalEmoteProvider.java | 18 +++++ .../providers/STVUserEmoteProvider.java | 25 +++++++ 6 files changed, 107 insertions(+), 45 deletions(-) create mode 100644 src/client/java/net/vinrobot/mcemote/client/providers/FFZRoomEmoteProvider.java create mode 100644 src/client/java/net/vinrobot/mcemote/client/providers/IEmoteProvider.java create mode 100644 src/client/java/net/vinrobot/mcemote/client/providers/IEmoteRegistry.java create mode 100644 src/client/java/net/vinrobot/mcemote/client/providers/STVGlobalEmoteProvider.java create mode 100644 src/client/java/net/vinrobot/mcemote/client/providers/STVUserEmoteProvider.java diff --git a/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java b/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java index 25e6059..68e36f1 100644 --- a/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java +++ b/src/client/java/net/vinrobot/mcemote/client/MinecraftEmoteModClient.java @@ -2,40 +2,22 @@ import net.fabricmc.api.ClientModInitializer; import net.vinrobot.mcemote.MinecraftEmoteMod; -import net.vinrobot.mcemote.api.FrankerFaceZService; -import net.vinrobot.mcemote.api.SevenTVService; -import net.vinrobot.mcemote.api.ffz.RoomResponse; -import net.vinrobot.mcemote.api.seventv.EmoteSet; -import net.vinrobot.mcemote.api.seventv.Platform; -import net.vinrobot.mcemote.api.seventv.UserResponse; import net.vinrobot.mcemote.client.font.Emote; -import net.vinrobot.mcemote.client.font.impl.FFZEmote; -import net.vinrobot.mcemote.client.font.impl.SevenTVEmote; +import net.vinrobot.mcemote.client.providers.FFZRoomEmoteProvider; +import net.vinrobot.mcemote.client.providers.IEmoteProvider; +import net.vinrobot.mcemote.client.providers.STVGlobalEmoteProvider; +import net.vinrobot.mcemote.client.providers.STVUserEmoteProvider; import net.vinrobot.mcemote.client.text.EmotesManager; import webpdecoderjn.WebPDecoder; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class MinecraftEmoteModClient implements ClientModInitializer { public static final EmotesManager EMOTES_MANAGER = new EmotesManager(); public static final String SCRAPIE_TWITCH_ID = "40646018"; - private static int addEmoteSet(EmotesManager manager, int baseCodePoint, EmoteSet emoteSet) { - int codePoint = baseCodePoint; - for (final Emote emote : emoteSet.emotes().stream().map(SevenTVEmote::new).toList()) { - manager.addEmote(codePoint++, emote); - } - return codePoint; - } - - private static int addEmoteSet(EmotesManager manager, int baseCodePoint, net.vinrobot.mcemote.api.ffz.EmoteSet emoteSet) { - int codePoint = baseCodePoint; - for (final Emote emote : emoteSet.emoticons().stream().map(FFZEmote::new).toList()) { - manager.addEmote(codePoint++, emote); - } - return codePoint; - } - @Override public void onInitializeClient() { // This entrypoint is suitable for setting up client-specific logic, such as rendering. @@ -45,32 +27,31 @@ public void onInitializeClient() { MinecraftEmoteMod.LOGGER.error("Failed to initialize WebPDecoder", e); } - try { - { - final SevenTVService api = new SevenTVService(); + final IEmoteProvider[] providers = new IEmoteProvider[]{ + new STVGlobalEmoteProvider(), + new STVUserEmoteProvider(SCRAPIE_TWITCH_ID), + new FFZRoomEmoteProvider(SCRAPIE_TWITCH_ID), + }; - final EmoteSet globalEmoteSet = api.fetchGlobalEmoteSet(); - addEmoteSet(EMOTES_MANAGER, 1, globalEmoteSet); - MinecraftEmoteMod.LOGGER.info("Loaded " + globalEmoteSet.emotes().size() + " global emotes"); + int codePoint = 100; - final UserResponse user = api.fetchUser(Platform.TWITCH, SCRAPIE_TWITCH_ID); - final EmoteSet userEmoteSet = user.emote_set(); - addEmoteSet(EMOTES_MANAGER, 100001, userEmoteSet); - MinecraftEmoteMod.LOGGER.info("Loaded " + userEmoteSet.emotes().size() + " emotes from user " + user.user().username()); - } - { - final FrankerFaceZService api = new FrankerFaceZService(); + for (final IEmoteProvider provider : providers) { + final String providerName = provider.getClass().getName(); - final RoomResponse room = api.fetchRoom(net.vinrobot.mcemote.api.ffz.Platform.TWITCH, SCRAPIE_TWITCH_ID); - int codePoint = 200001; - for (final net.vinrobot.mcemote.api.ffz.EmoteSet emoteSet : room.sets().values()) { - codePoint = addEmoteSet(EMOTES_MANAGER, codePoint, emoteSet); + try { + // "Register" emotes in a temporary list + // If an exception is thrown, the emotes will not be added to the manager + final List emotes = new ArrayList<>(); + provider.registerEmotes(emotes::add); + + for (final Emote emote : emotes) { + EMOTES_MANAGER.addEmote(codePoint++, emote); } - int count = room.sets().values().stream().map(e -> e.emoticons().size()).reduce(Integer::sum).orElse(0); - MinecraftEmoteMod.LOGGER.info("Loaded " + count + " emotes from room " + room.room().id()); + + MinecraftEmoteMod.LOGGER.info("Registered " + emotes.size() + " emotes from provider " + providerName); + } catch (Exception e) { + MinecraftEmoteMod.LOGGER.error("Failed to register emotes from provider " + providerName, e); } - } catch (Exception e) { - throw new RuntimeException(e); } } } diff --git a/src/client/java/net/vinrobot/mcemote/client/providers/FFZRoomEmoteProvider.java b/src/client/java/net/vinrobot/mcemote/client/providers/FFZRoomEmoteProvider.java new file mode 100644 index 0000000..e75477a --- /dev/null +++ b/src/client/java/net/vinrobot/mcemote/client/providers/FFZRoomEmoteProvider.java @@ -0,0 +1,26 @@ +package net.vinrobot.mcemote.client.providers; + +import net.vinrobot.mcemote.api.FrankerFaceZService; +import net.vinrobot.mcemote.api.ffz.Platform; +import net.vinrobot.mcemote.client.font.impl.FFZEmote; + +import java.io.IOException; + +public class FFZRoomEmoteProvider implements IEmoteProvider { + private final String userId; + + public FFZRoomEmoteProvider(String userId) { + this.userId = userId; + } + + @Override + public void registerEmotes(IEmoteRegistry registry) throws IOException, InterruptedException { + final FrankerFaceZService service = new FrankerFaceZService(); + + service.fetchRoom(Platform.TWITCH, this.userId) + .sets().values().stream() + .flatMap(emoteSet -> emoteSet.emoticons().stream()) + .map(FFZEmote::new) + .forEach(registry::registerEmote); + } +} diff --git a/src/client/java/net/vinrobot/mcemote/client/providers/IEmoteProvider.java b/src/client/java/net/vinrobot/mcemote/client/providers/IEmoteProvider.java new file mode 100644 index 0000000..737cd35 --- /dev/null +++ b/src/client/java/net/vinrobot/mcemote/client/providers/IEmoteProvider.java @@ -0,0 +1,5 @@ +package net.vinrobot.mcemote.client.providers; + +public interface IEmoteProvider { + void registerEmotes(IEmoteRegistry registry) throws Exception; +} diff --git a/src/client/java/net/vinrobot/mcemote/client/providers/IEmoteRegistry.java b/src/client/java/net/vinrobot/mcemote/client/providers/IEmoteRegistry.java new file mode 100644 index 0000000..5e3376a --- /dev/null +++ b/src/client/java/net/vinrobot/mcemote/client/providers/IEmoteRegistry.java @@ -0,0 +1,7 @@ +package net.vinrobot.mcemote.client.providers; + +import net.vinrobot.mcemote.client.font.Emote; + +public interface IEmoteRegistry { + void registerEmote(Emote emote); +} diff --git a/src/client/java/net/vinrobot/mcemote/client/providers/STVGlobalEmoteProvider.java b/src/client/java/net/vinrobot/mcemote/client/providers/STVGlobalEmoteProvider.java new file mode 100644 index 0000000..b86eda1 --- /dev/null +++ b/src/client/java/net/vinrobot/mcemote/client/providers/STVGlobalEmoteProvider.java @@ -0,0 +1,18 @@ +package net.vinrobot.mcemote.client.providers; + +import net.vinrobot.mcemote.api.SevenTVService; +import net.vinrobot.mcemote.client.font.impl.SevenTVEmote; + +import java.io.IOException; + +public class STVGlobalEmoteProvider implements IEmoteProvider { + @Override + public void registerEmotes(IEmoteRegistry registry) throws IOException, InterruptedException { + final SevenTVService service = new SevenTVService(); + + service.fetchGlobalEmoteSet() + .emotes().stream() + .map(SevenTVEmote::new) + .forEach(registry::registerEmote); + } +} diff --git a/src/client/java/net/vinrobot/mcemote/client/providers/STVUserEmoteProvider.java b/src/client/java/net/vinrobot/mcemote/client/providers/STVUserEmoteProvider.java new file mode 100644 index 0000000..a0d42e2 --- /dev/null +++ b/src/client/java/net/vinrobot/mcemote/client/providers/STVUserEmoteProvider.java @@ -0,0 +1,25 @@ +package net.vinrobot.mcemote.client.providers; + +import net.vinrobot.mcemote.api.SevenTVService; +import net.vinrobot.mcemote.api.seventv.Platform; +import net.vinrobot.mcemote.client.font.impl.SevenTVEmote; + +import java.io.IOException; + +public class STVUserEmoteProvider implements IEmoteProvider { + private final String userId; + + public STVUserEmoteProvider(String userId) { + this.userId = userId; + } + + @Override + public void registerEmotes(IEmoteRegistry registry) throws IOException, InterruptedException { + final SevenTVService service = new SevenTVService(); + + service.fetchUser(Platform.TWITCH, this.userId) + .emote_set().emotes().stream() + .map(SevenTVEmote::new) + .forEach(registry::registerEmote); + } +}