Skip to content

Commit 75b3e8f

Browse files
committed
command for exploring packs, basic permissions for emojis and listing emojis, fix hanging on request enforced packs. pack jsons can now be downloaded on startup rather than stored persistently. remove unused / unneeded dependencies. manager is started by future.
1 parent eb08da8 commit 75b3e8f

File tree

10 files changed

+343
-129
lines changed

10 files changed

+343
-129
lines changed

.github/workflows/pack-resources.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ jobs:
4040
java -cp minemoji-*.jar com.github.cinnamondev.minemoji.PackMaker.PackMaker
4141
--input-directory ./twemoji/assets/svg/
4242
--output-directory ./site/packs/twemoji-latest
43+
--width 48
4344
--prefix unicode
4445
--skip-packgen
4546
--pack-url https://cinnamondev.github.io/minemoji/packs/twemoji-latest.zip

pom.xml

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.github.cinnamondev</groupId>
88
<artifactId>minemoji</artifactId>
9-
<version>1.01</version>
9+
<version>1.02</version>
1010
<packaging>jar</packaging>
1111

1212
<name>minemoji</name>
@@ -83,26 +83,16 @@
8383
<artifactId>jemoji</artifactId>
8484
<version>1.7.5</version>
8585
</dependency>
86-
<!--Batik & Commons-CLI is only required for PackMaker to be available.-->
87-
<dependency>
88-
<groupId>com.google.code.gson</groupId>
89-
<artifactId>gson</artifactId>
90-
<version>2.11.0</version>
91-
</dependency>
9286
<dependency>
9387
<groupId>org.apache.commons</groupId>
9488
<artifactId>commons-collections4</artifactId>
9589
<version>4.4</version>
9690
</dependency>
91+
<!--Batik & Commons-CLI is only required for PackMaker to be available.-->
9792
<dependency>
98-
<groupId>org.apache.logging.log4j</groupId>
99-
<artifactId>log4j-api</artifactId>
100-
<version>2.24.1</version>
101-
</dependency>
102-
<dependency>
103-
<groupId>org.apache.logging.log4j</groupId>
104-
<artifactId>log4j-core</artifactId>
105-
<version>2.24.1</version>
93+
<groupId>com.google.code.gson</groupId>
94+
<artifactId>gson</artifactId>
95+
<version>2.11.0</version>
10696
</dependency>
10797
<dependency>
10898
<groupId>org.apache.xmlgraphics</groupId>
Lines changed: 142 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,118 @@
11
package com.github.cinnamondev.minemoji;
22

33
import com.google.common.collect.Lists;
4+
import com.mojang.brigadier.arguments.IntegerArgumentType;
45
import com.mojang.brigadier.arguments.StringArgumentType;
56
import com.mojang.brigadier.context.CommandContext;
67
import com.mojang.brigadier.exceptions.CommandSyntaxException;
78
import com.mojang.brigadier.tree.LiteralCommandNode;
89
import io.papermc.paper.command.brigadier.CommandSourceStack;
910
import io.papermc.paper.command.brigadier.Commands;
11+
import net.fellbaum.jemoji.Emoji;
1012
import net.kyori.adventure.text.Component;
1113
import net.kyori.adventure.text.JoinConfiguration;
1214
import net.kyori.adventure.text.ObjectComponent;
1315
import net.kyori.adventure.text.event.ClickEvent;
1416
import net.kyori.adventure.text.event.HoverEvent;
17+
import net.kyori.adventure.text.format.NamedTextColor;
18+
import net.kyori.adventure.text.format.Style;
19+
import net.kyori.adventure.text.format.TextDecoration;
1520

16-
import java.util.List;
21+
import java.util.*;
22+
import java.util.stream.Collectors;
1723

1824

1925
public class Command {
20-
private final SpriteEmojiManager manager;
2126
private final Minemoji p;
27+
private final LiteralCommandNode<CommandSourceStack> command;
28+
private Map<String, List<Component>> packPages = Collections.emptyMap();
29+
private List<Component> defaultPackPages = Collections.emptyList();
30+
31+
public void registerCustomPacks(Map<String, EmojiSet> packs) {
32+
this.packPages = packs.entrySet().stream().map(e ->
33+
Map.entry(e.getKey(),
34+
paginateComponents(e.getValue().emojis.stream()
35+
.map(emote -> emoteWithLore(
36+
SpriteEmojiManager.spriteMetaToComponent(emote),
37+
":" + e.getKey() + "--" + emote.emojiText + ":"
38+
)).toList(), 8, 8)
39+
)).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
40+
}
41+
42+
public void registerDefaultPack(Map<Emoji, ObjectComponent> pack) {
43+
this.defaultPackPages = paginateComponents(
44+
pack.entrySet().stream()
45+
.filter(e -> !e.getKey().getDiscordAliases().isEmpty())
46+
.map(e -> emoteWithLore(e.getValue(), e.getKey().getDiscordAliases().getFirst()))
47+
.toList(),
48+
8,
49+
8
50+
);
51+
}
52+
53+
2254
public Command(Minemoji p) {
2355
this.p = p;
24-
this.manager = p.emojiManager;
25-
}
56+
command = Commands.literal("minemoji")
57+
.then(Commands.literal("about")
58+
.executes(ctx -> {
59+
ctx.getSource().getSender().sendMessage(
60+
Component.text("Minemoji " + p.getPluginMeta().getVersion())
61+
.color(NamedTextColor.LIGHT_PURPLE)
62+
.appendNewline()
63+
.append(Component.text("[Github]")
64+
.style(Style.style(NamedTextColor.AQUA, TextDecoration.BOLD))
65+
.clickEvent(ClickEvent.openUrl("https://github.com/cinnamondev/minemoji"))
66+
)
67+
);
68+
return 1;
69+
})
70+
)
71+
.then(Commands.literal("list")
72+
.requires(src -> src.getSender().hasPermission("minemoji.list"))
73+
.then(Commands.argument("pack", StringArgumentType.word())
74+
.suggests((ctx, builder) -> {
75+
if ("unicode".startsWith(builder.getRemainingLowerCase())) {
76+
builder.suggest("unicode");
77+
}
78+
packPages.keySet().stream()
79+
.filter(k ->
80+
k.toLowerCase().startsWith(builder.getRemainingLowerCase())
81+
)
82+
.forEach(builder::suggest);
83+
return builder.buildFuture();
84+
})
85+
.then(Commands.argument("page", IntegerArgumentType.integer(1))
86+
.executes(ctx -> listByPack(ctx,
87+
ctx.getArgument("pack", String.class),
88+
ctx.getArgument("page", Integer.class))
89+
)
90+
)
91+
.executes(ctx -> listByPack(ctx, ctx.getArgument("pack", String.class), 1))
92+
)
93+
.executes(ctx -> {
94+
Component text = Component.text("All available custom emote packs").append(
95+
Component.join(JoinConfiguration.newlines(),
96+
packPages.keySet().stream().map(str ->
97+
Component.text(str)
98+
.decorate(TextDecoration.UNDERLINED)
99+
.hoverEvent(HoverEvent.showText(Component.text("Click to show pack contents")))
100+
.clickEvent(ClickEvent.runCommand("minemoji list " + str))
101+
).toList()
102+
));
103+
ctx.getSource().getSender().sendMessage(text);
104+
return 1;
105+
})
106+
)
107+
.then(Commands.literal("help").executes(Command::helpCommand))
108+
.executes(Command::helpCommand)
109+
.build();
26110

27-
private final LiteralCommandNode<CommandSourceStack> COMMAND = Commands.literal("minemoji")
28-
.then(Commands.literal("list")
29-
.then(Commands.argument("pack", StringArgumentType.word())
30-
.executes(ctx -> listByPack(ctx, false)))
31-
.then(Commands.literal("normal")
32-
.executes(ctx -> listByPack(ctx, true)))
33-
)
34-
.then(Commands.literal("help"))
35-
.executes(Command::helpCommand)
36-
.build();
111+
}
37112

113+
public LiteralCommandNode<CommandSourceStack> command() {
114+
return command;
115+
}
38116
private Component emoteWithLore(ObjectComponent component, String knownString) {
39117
return component
40118
.hoverEvent(HoverEvent.showText(
@@ -44,36 +122,67 @@ private Component emoteWithLore(ObjectComponent component, String knownString) {
44122
))
45123
.clickEvent(ClickEvent.copyToClipboard(knownString));
46124
}
47-
private static Component formatEmotes(List<Component> components, int columns) {
48-
return Component.join(JoinConfiguration.newlines(),
49-
Lists.partition(components, columns).stream()
50-
.map(cs -> Component.join(JoinConfiguration.separator(Component.text(" ")), cs))
51-
.toList()
52-
);
125+
// turn a list of components into a list of components containing columns*rows components smushed together.
126+
private static List<Component> paginateComponents(List<Component> components, int columns, int rows) {
127+
return Lists.partition(components, columns * rows).stream()
128+
.map(l -> Component.join(JoinConfiguration.newlines(),
129+
Lists.partition(l, columns).stream()
130+
.map(cs -> Component.join(JoinConfiguration.separator(Component.text(" ")), cs))
131+
.toList()
132+
))
133+
.toList();
53134
}
54135

55-
private int listByPack(CommandContext<CommandSourceStack> context, boolean defaultPack) throws CommandSyntaxException {
136+
private int listByPack(CommandContext<CommandSourceStack> context, String pack, int page) throws CommandSyntaxException {
56137
List<Component> list;
57-
if (defaultPack) {
58-
list = manager.getDefaultEmojiMap().entrySet().stream()
59-
.map(e -> emoteWithLore(e.getValue(),e.getKey().getDiscordAliases().getFirst()))
60-
.toList();
61-
} else {
62-
list = manager.getPackByPrefix(context.getArgument("pack", String.class)).stream()
63-
.flatMap(p -> p.emojis.stream()
64-
.map(m -> emoteWithLore(SpriteEmojiManager.spriteMetaToComponent(m), ":" + m.emojiText + ":"))
65-
).toList();
138+
if (pack.equalsIgnoreCase("unicode")) {
139+
list = defaultPackPages;
140+
} else { list = packPages.get(pack); }
141+
142+
if (list == null || list.isEmpty()) {
143+
context.getSource().getSender().sendMessage(Component.text("No pack found!").color(NamedTextColor.RED));
144+
return 1;
66145
}
67146

68-
if (list.isEmpty()) {
69-
context.getSource().getSender().sendMessage(Component.text("No pack found!"));
147+
if (page > list.size() || page <= 0) {
148+
context.getSource().getSender().sendMessage(Component.text("Page does not exist").color(NamedTextColor.RED));
70149
return 1;
71150
}
72151

73-
context.getSource().getSender().sendMessage(formatEmotes(list, 10));
152+
context.getSource().getSender().sendMessage(
153+
Component.text("Pack " + pack + ":").appendNewline().append(
154+
list.get(page - 1)
155+
).appendNewline().append(pageScroller(pack, page, list.size()))
156+
);
74157
return 1;
75158
}
159+
160+
private static Component pageScroller(String pack, int currentPage, int totalPages) {
161+
if (totalPages == 1) { return Component.empty(); }
162+
Component backPage = Component.text("[ << ]")
163+
.decorate(TextDecoration.BOLD)
164+
.color(NamedTextColor.GRAY);
165+
if ((currentPage-1 > 0)) {
166+
backPage = backPage.color(NamedTextColor.AQUA)
167+
.clickEvent(ClickEvent.runCommand("minemoji list " + pack + " " + (currentPage - 1)));
168+
}
169+
170+
Component nextPage = Component.text("[ >> ]")
171+
.decorate(TextDecoration.BOLD)
172+
.color(NamedTextColor.GRAY);
173+
if ((currentPage+1) <= totalPages) {
174+
nextPage = nextPage.color(NamedTextColor.AQUA)
175+
.clickEvent(ClickEvent.runCommand("minemoji list " + pack + " " + (currentPage + 1)));
176+
}
177+
178+
return backPage
179+
.append(Component.text(" " + currentPage + "/" + totalPages + " ").color(NamedTextColor.YELLOW))
180+
.append(nextPage);
181+
182+
}
76183
private static int helpCommand(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
184+
context.getSource().getSender().sendMessage(Component.text("""
185+
/minemoji list <pack-name|unicode>"""));
77186
return 1;
78187
}
79188
}

src/main/java/com/github/cinnamondev/minemoji/EmojiRenderer.java

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,11 @@
88
import org.bukkit.event.EventHandler;
99
import org.bukkit.event.Listener;
1010

11-
import java.util.HashMap;
12-
import java.util.Map;
1311

1412
public class EmojiRenderer implements Listener, io.papermc.paper.chat.ChatRenderer {
15-
private final Map<String, Component> codepointLookup = new HashMap<>();
16-
private final Map<String, Component> identfierLookup = new HashMap<>();
17-
//private final Pattern pattern;
18-
19-
private final Minemoji p;
20-
public EmojiRenderer(Minemoji p) {
21-
this.p = p;
22-
//pattern = Pattern.compile(":(sob|):");
13+
private final SpriteEmojiManager manager;
14+
public EmojiRenderer(SpriteEmojiManager manager) {
15+
this.manager = manager;
2316
}
2417

2518
@EventHandler
@@ -29,8 +22,9 @@ public void onChat(AsyncChatEvent e) {
2922

3023
@Override
3124
public Component render(Player source, Component sourceDisplayName, Component message, Audience viewer) {
32-
var newComponent = p.emojiManager.emojize(message);
33-
p.emojiManager.demojize(newComponent);
34-
return ChatRenderer.defaultRenderer().render(source, sourceDisplayName, newComponent, viewer);
25+
if (!source.hasPermission("minemoji.emoji")) {
26+
return ChatRenderer.defaultRenderer().render(source, sourceDisplayName, message, viewer);
27+
}
28+
return ChatRenderer.defaultRenderer().render(source, sourceDisplayName, manager.emojize(message), viewer);
3529
}
3630
}

0 commit comments

Comments
 (0)