Skip to content

Commit

Permalink
Split emote loading into different emote provider
Browse files Browse the repository at this point in the history
  • Loading branch information
Vinrobot committed Jul 17, 2023
1 parent ef083b3 commit a182d8c
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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<Emote> 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);
}
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.vinrobot.mcemote.client.providers;

public interface IEmoteProvider {
void registerEmotes(IEmoteRegistry registry) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.vinrobot.mcemote.client.providers;

import net.vinrobot.mcemote.client.font.Emote;

public interface IEmoteRegistry {
void registerEmote(Emote emote);
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit a182d8c

Please sign in to comment.