Skip to content

Commit

Permalink
Improved the emoji command
Browse files Browse the repository at this point in the history
+ Fixed array == null issue
+ Merged aliases into a single emoji, with their names listed in the tooltip
+ Added the codepoint to the tooltip
+ Added autocompletion support for the categories
+ Added spacing between groups when displaying "all"
  • Loading branch information
omoflop authored and UnlikePaladin committed Aug 18, 2023
1 parent 9d305ff commit f0afe52
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 38 deletions.
Expand Up @@ -4,67 +4,92 @@
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import org.figuramc.figura.font.EmojiContainer;
import org.figuramc.figura.font.EmojiUnicodeLookup;
import org.figuramc.figura.font.Emojis;
import org.figuramc.figura.utils.ColorUtils;
import org.figuramc.figura.utils.FiguraClientCommandSource;

import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;

import static net.minecraft.network.chat.Component.literal;

class EmojiListCommand {
private static final Component COMMA_SPACE = literal(", ").withStyle(ChatFormatting.GRAY);

public static LiteralArgumentBuilder<FiguraClientCommandSource> getCommand() {
LiteralArgumentBuilder<FiguraClientCommandSource> load = LiteralArgumentBuilder.literal("emojis");

RequiredArgumentBuilder<FiguraClientCommandSource, String> path = RequiredArgumentBuilder.argument("category", StringArgumentType.greedyString());
path.suggests(EmojiListCommand::getSuggestions);
path.executes(EmojiListCommand::listCategory);

LiteralArgumentBuilder<FiguraClientCommandSource> all = LiteralArgumentBuilder.literal("all");
all.executes(EmojiListCommand::listAll);

return load.then(path).then(all);
return load.then(path);
}

private static int listCategory(CommandContext<FiguraClientCommandSource> context) {
FiguraClientCommandSource src = context.getSource();
return printEmojis(context.getArgument("category", String.class), src::figura$sendFeedback, src::figura$sendError) ? 1 : 0;
public static CompletableFuture<Suggestions> getSuggestions(CommandContext<FiguraClientCommandSource> context, SuggestionsBuilder builder) {
builder.suggest("all");
Emojis.getCategoryNames().forEach(builder::suggest);
return builder.buildFuture();
}

private static int listAll(CommandContext<FiguraClientCommandSource> context) {
private static int listCategory(CommandContext<FiguraClientCommandSource> context) {
FiguraClientCommandSource src = context.getSource();
for (String category : Emojis.getCategoryNames()) {
if (!printEmojis(category, src::figura$sendFeedback, src::figura$sendError)) {
return 0;
String category = context.getArgument("category", String.class);
if (Objects.equals(category, "all")) {
for (String curCategory : Emojis.getCategoryNames()) {
if (!printEmojis(curCategory, src::figura$sendFeedback, src::figura$sendError)) {
return 0;
}
src.figura$sendFeedback(literal(""));
}
}

return 1;
return 1;
}
return printEmojis(category, src::figura$sendFeedback, src::figura$sendError) ? 1 : 0;
}


private static boolean printEmojis(String category, Consumer<Component> feedback, Consumer<Component> error) {
if (!Emojis.hasCategory(category)) {
error.accept(literal("Emoji category \"" + category + "\" doesn't exist!"));
return false;
}

EmojiContainer container = Emojis.getCategory(category);

// give the category a title
feedback.accept(literal("--- " + container.name + " ---").withStyle(ColorUtils.Colors.AWESOME_BLUE.style));

Collection<String> unicodeValues = container.getLookup().unicodeValues();
EmojiUnicodeLookup lookup = container.getLookup();

StringBuilder builder = new StringBuilder();

// Gather each emoji name and append it into one big string
lookup.aliasValues().stream().sorted().forEach(key -> Arrays.stream(lookup.getAliases(key)).forEach(name -> builder.append(':').append(name).append(':').append(' ')));
// give the category a title
feedback.accept(literal(String.format("--- %s (%s) ---", container.name, unicodeValues.size())).withStyle(ColorUtils.Colors.AWESOME_BLUE.style));


// Gather each emoji name and append it into a single message
MutableComponent comp = literal("");
unicodeValues.stream().sorted().forEach(unicode -> {
String[] aliases = lookup.getNames(unicode);
if (aliases != null) {
MutableComponent msg = literal("");
for (int i = 0; i < aliases.length; i++) {
msg.append(literal(aliases[i]).withStyle(ColorUtils.Colors.AWESOME_BLUE.style));
if (i < aliases.length - 1) {
msg.append(COMMA_SPACE);
}
}
msg.append(literal("\ncodepoint: " + unicode.codePointAt(0)).withStyle(ChatFormatting.GRAY));
comp.append(Emojis.getEmoji(aliases[0], msg));
}
});

feedback.accept(literal(builder.toString()));
feedback.accept(comp);

return true;
}
Expand Down
Expand Up @@ -6,6 +6,7 @@
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style;
import net.minecraft.resources.ResourceLocation;
import org.figuramc.figura.FiguraMod;
Expand Down Expand Up @@ -112,22 +113,26 @@ public void tickAnimations() {
}

public Component getEmojiComponent(String key) {
return getEmojiComponent(key, Component.literal(DELIMITER + key + DELIMITER));
}

public Component getEmojiComponent(String key, MutableComponent hover) {
String unicode = lookup.getUnicode(key);
if (unicode == null)
return null;
return makeComponent(unicode, DELIMITER + key + DELIMITER);
return makeComponent(unicode, hover);
}

public Component getShortcutComponent(String shortcut) {
String unicode = lookup.getUnicodeForShortcut(shortcut);
if (unicode == null)
return null;
return makeComponent(unicode, shortcut);
return makeComponent(unicode, Component.literal(shortcut));
}

private Component makeComponent(String unicode, String hover) {
private Component makeComponent(String unicode, MutableComponent hover) {
return Component.literal(unicode).withStyle(STYLE.withFont(font).withHoverEvent(
new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal(hover)
new HoverEvent(HoverEvent.Action.SHOW_TEXT, hover
.append("\n")
.append(FiguraText.of("emoji." + name).withStyle(ChatFormatting.DARK_GRAY)))
));
Expand Down
Expand Up @@ -6,9 +6,10 @@

public class EmojiUnicodeLookup {
private final Map<String, String> unicodeLookup = new HashMap<>(); // <EmojiName, Unicode>
private final HashMap<String, String[]> reverseUnicodeLookup = new HashMap<>(); // <Unicode, EmojiNames[]>
private final Map<String, String[]> reverseUnicodeLookup = new HashMap<>(); // <Unicode, EmojiNames[]>
private final Map<Integer, EmojiMetadata> metadataLookup = new HashMap<>(); // <Codepoint, EmojiMetadata>
private final Map<String, String> shortcutLookup = new HashMap<>(); // <Shortcut, Unicode>
private final Map<String, String[]> reverseShortcutLookup = new HashMap<>(); // <Unicode, Shortcut[]>

public void putAliases(String[] aliases, String unicode) {
for (String alias : aliases) {
Expand All @@ -17,10 +18,11 @@ public void putAliases(String[] aliases, String unicode) {
reverseUnicodeLookup.put(unicode, aliases);
}

public void putShortcuts(String[] aliases, String unicode) {
for (String alias : aliases) {
public void putShortcuts(String[] shortcuts, String unicode) {
for (String alias : shortcuts) {
shortcutLookup.put(alias, unicode);
}
reverseShortcutLookup.put(unicode, shortcuts);
}

public void putMetadata(int codepoint, EmojiMetadata metadata) {
Expand All @@ -31,10 +33,18 @@ public Collection<String> getNames() {
return unicodeLookup.keySet();
}

public @Nullable String[] getNames(String unicode) {
return reverseUnicodeLookup.getOrDefault(unicode, null);
}

public Collection<String> getShortcuts() {
return shortcutLookup.keySet();
}

public @Nullable String[] getShortcuts(String unicode) {
return reverseShortcutLookup.getOrDefault(unicode, null);
}

public @Nullable EmojiMetadata getMetadata(int codepoint) {
return metadataLookup.getOrDefault(codepoint, null);
}
Expand All @@ -47,19 +57,15 @@ public Collection<String> getShortcuts() {
return shortcutLookup.getOrDefault(shortcut, null);
}

public @Nullable String[] getAliases(String unicode) {
return reverseUnicodeLookup.getOrDefault(unicode, null);
}




public Collection<EmojiMetadata> metadataValues() {
return metadataLookup.values();
}

public Set<String> aliasValues() {
return unicodeLookup.keySet();
}

public Collection<String> unicodeValues() {
return unicodeLookup.values();
return reverseUnicodeLookup.keySet();
}
}
10 changes: 10 additions & 0 deletions common/src/main/java/org/figuramc/figura/font/Emojis.java
Expand Up @@ -224,6 +224,16 @@ public static Component getEmoji(String emojiAlias) {
return null;
}

public static Component getEmoji(String emojiAlias, MutableComponent hover) {
for (EmojiContainer container : EMOJIS.values()) {
Component emoji = container.getEmojiComponent(emojiAlias, hover);
if (emoji != null) {
return emoji;
}
}
return null;
}

public static EmojiContainer getCategoryByFont(ResourceLocation location) {
for (EmojiContainer container : EMOJIS.values()) {
if (location.equals(container.getFont())) {
Expand Down

0 comments on commit f0afe52

Please sign in to comment.