1717
1818package com .lambda .mixin .render ;
1919
20- import com .google .common .base .Strings ;
2120import com .lambda .command .CommandManager ;
22- import com .lambda .graphics .renderer .gui .font .core .LambdaAtlas ;
23- import com .lambda .module .modules .client .LambdaMoji ;
24- import com .lambda .module .modules .client .StyleEditor ;
2521import com .mojang .brigadier .CommandDispatcher ;
26- import com .mojang .brigadier .suggestion .Suggestions ;
27- import com .mojang .brigadier .suggestion .SuggestionsBuilder ;
2822import net .minecraft .client .gui .screen .ChatInputSuggestor ;
2923import net .minecraft .client .gui .widget .TextFieldWidget ;
3024import net .minecraft .client .network .ClientPlayNetworkHandler ;
3125import net .minecraft .command .CommandSource ;
32- import org .jetbrains .annotations .Nullable ;
3326import com .llamalad7 .mixinextras .injector .wrapoperation .Operation ;
3427import com .llamalad7 .mixinextras .injector .wrapoperation .WrapOperation ;
3528import org .spongepowered .asm .mixin .Final ;
3629import org .spongepowered .asm .mixin .Mixin ;
3730import org .spongepowered .asm .mixin .Shadow ;
38- import org .spongepowered .asm .mixin .Unique ;
3931import org .spongepowered .asm .mixin .injection .At ;
40- import org .spongepowered .asm .mixin .injection .Inject ;
4132import org .spongepowered .asm .mixin .injection .ModifyVariable ;
42- import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
43-
44- import java .util .Map ;
45- import java .util .concurrent .CompletableFuture ;
46- import java .util .regex .Matcher ;
47- import java .util .regex .Pattern ;
48- import java .util .stream .Stream ;
4933
5034@ Mixin (ChatInputSuggestor .class )
5135public abstract class ChatInputSuggestorMixin {
52- @ Unique private static final Pattern COLON_PATTERN = Pattern .compile ("(:[a-zA-Z0-9_]+)" );
53- @ Unique private static final Pattern EMOJI_PATTERN = Pattern .compile ("(:)([a-zA-Z0-9_]+)(:)" );
5436 @ Shadow @ Final TextFieldWidget textField ;
55- @ Shadow private @ Nullable CompletableFuture <Suggestions > pendingSuggestions ;
5637
5738 @ Shadow
5839 public abstract void show (boolean narrateFirstSuggestion );
@@ -67,64 +48,4 @@ private boolean refreshModify(boolean showCompletions) {
6748 private CommandDispatcher <CommandSource > wrapRefresh (ClientPlayNetworkHandler instance , Operation <CommandDispatcher <CommandSource >> original ) {
6849 return (CommandDispatcher <CommandSource >) CommandManager .INSTANCE .currentDispatcher (textField .getText ());
6950 }
70-
71- @ Inject (method = "refresh" , at = @ At ("TAIL" ))
72- private void refreshEmojiSuggestion (CallbackInfo ci ) {
73- if (!LambdaMoji .INSTANCE .isEnabled () ||
74- !LambdaMoji .INSTANCE .getSuggestions ()) return ;
75-
76- String typing = textField .getText ();
77-
78- // Don't suggest emojis in commands
79- if (CommandManager .INSTANCE .isCommand (typing ) ||
80- CommandManager .INSTANCE .isLambdaCommand (typing )) return ;
81-
82- int cursor = textField .getCursor ();
83- String textToCursor = typing .substring (0 , cursor );
84- if (textToCursor .isEmpty ()) return ;
85-
86- // Most right index at the left of the regex expression
87- int start = neoLambda$getLastColon (textToCursor );
88- if (start == -1 ) return ;
89-
90- Matcher emojiMatcher = EMOJI_PATTERN .matcher (textToCursor );
91- Map <String , ?> emojiKeys = LambdaAtlas .INSTANCE .getKeys (StyleEditor .INSTANCE .getEmojiFont ());
92- while (emojiMatcher .find ()) {
93- int openingColon = emojiMatcher .start (1 );
94- String key = emojiMatcher .group (2 );
95- int closingColon = emojiMatcher .end (3 );
96-
97- if (emojiKeys .containsKey (key ) && start >= openingColon && start < closingColon ) {
98- // If the colon is part of a previous valid emoji, return
99- return ;
100- }
101- }
102-
103- String emojiString = textToCursor .substring (start + 1 );
104-
105- Stream <String > results = emojiKeys .keySet ().stream ()
106- .filter (s -> s .startsWith (emojiString ))
107- .map (s -> s + ":" );
108-
109- pendingSuggestions = CommandSource .suggestMatching (results , new SuggestionsBuilder (textToCursor , start + 1 ));
110- pendingSuggestions .thenRun (() -> {
111- if (!pendingSuggestions .isDone ()) return ;
112-
113- show (false );
114- });
115- }
116-
117- @ Unique
118- private int neoLambda$getLastColon (String input ) {
119- if (Strings .isNullOrEmpty (input )) return -1 ;
120-
121- int i = -1 ;
122- Matcher matcher = COLON_PATTERN .matcher (input );
123-
124- while (matcher .find ()) {
125- i = matcher .start ();
126- }
127-
128- return i ;
129- }
13051}
0 commit comments