11package com .github .cinnamondev .minemoji ;
22
33import com .google .common .collect .Lists ;
4+ import com .mojang .brigadier .arguments .IntegerArgumentType ;
45import com .mojang .brigadier .arguments .StringArgumentType ;
56import com .mojang .brigadier .context .CommandContext ;
67import com .mojang .brigadier .exceptions .CommandSyntaxException ;
78import com .mojang .brigadier .tree .LiteralCommandNode ;
89import io .papermc .paper .command .brigadier .CommandSourceStack ;
910import io .papermc .paper .command .brigadier .Commands ;
11+ import net .fellbaum .jemoji .Emoji ;
1012import net .kyori .adventure .text .Component ;
1113import net .kyori .adventure .text .JoinConfiguration ;
1214import net .kyori .adventure .text .ObjectComponent ;
1315import net .kyori .adventure .text .event .ClickEvent ;
1416import 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
1925public 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}
0 commit comments