6161@ AllArgsConstructor
6262public class BungeeQuickChat implements QuickChat {
6363 private final QuickShop plugin ;
64+ private final String [] indexStrCache = {"{0}" , "{1}" , "{2}" , "{3}" , "{4}" , "{5}" , "{6}" , "{7}" , "{8}" , "{9}" };
6465
6566 public static BaseComponent [] fromLegacyText (String text ) {
6667 return TextComponent .fromLegacyText (text , net .md_5 .bungee .api .ChatColor .RESET );
6768 }
6869
69- @ Override
70- public void send (@ NotNull CommandSender receiver , @ Nullable QuickComponent component ) {
71- if (component == null ) {
72- return ;
73- }
74- if (component .get () instanceof BaseComponent []) {
75- receiver .spigot ().sendMessage ((BaseComponent []) component .get ());
76- return ;
77- }
78- if (component .get () instanceof BaseComponent ) {
79- receiver .spigot ().sendMessage ((BaseComponent ) component .get ());
80- return ;
81- }
82- Util .debugLog ("Illegal component " + component .get ().getClass ().getName () + " sending to " + this .getClass ().getName () + " processor, trying force sending." );
83-
84- }
85-
8670 public static String toLegacyText (BaseComponent [] components ) {
8771 StringBuilder builder = new StringBuilder ();
8872 BaseComponent lastComponent = null ;
@@ -108,6 +92,23 @@ public static String toLegacyText(BaseComponent[] components) {
10892 return builder .toString ();
10993 }
11094
95+ @ Override
96+ public void send (@ NotNull CommandSender receiver , @ Nullable QuickComponent component ) {
97+ if (component == null ) {
98+ return ;
99+ }
100+ if (component .get () instanceof BaseComponent []) {
101+ receiver .spigot ().sendMessage ((BaseComponent []) component .get ());
102+ return ;
103+ }
104+ if (component .get () instanceof BaseComponent ) {
105+ receiver .spigot ().sendMessage ((BaseComponent ) component .get ());
106+ return ;
107+ }
108+ Util .debugLog ("Illegal component " + component .get ().getClass ().getName () + " sending to " + this .getClass ().getName () + " processor, trying force sending." );
109+
110+ }
111+
111112 @ Override
112113 public void send (@ NotNull CommandSender receiver , @ Nullable String message ) {
113114 if (StringUtils .isEmpty (message )) {
@@ -121,7 +122,6 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @
121122 sendItemHologramChat (player , text , itemStack , false );
122123 }
123124
124-
125125 private BungeeComponentBuilder appendItemHoloChat (@ Nullable String itemJson , @ NotNull String message ) {
126126 BungeeComponentBuilder builder = new BungeeComponentBuilder ();
127127 TextSplitter .SpilledString spilledString = TextSplitter .deBakeItem (message );
@@ -177,7 +177,8 @@ private void sendItemHologramChat(@NotNull Player player, @NotNull String text,
177177 } else {
178178 player .spigot ().sendMessage (result );
179179 }
180- } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException | InstantiationException e ) {
180+ } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException |
181+ InstantiationException e ) {
181182 plugin .getLogger ().log (Level .WARNING , "Failed to process chat component" , e );
182183 player .spigot ().sendMessage (errorComponent );
183184 }
@@ -226,8 +227,103 @@ private void sendItemHologramChat(@NotNull Player player, @NotNull String text,
226227 }
227228 }
228229
230+ @ Override
231+ public @ NotNull QuickComponent getItemTextComponent (@ NotNull Player player , @ NotNull ItemStack itemStack , @ NotNull String normalText ) {
232+ TextComponent errorComponent = new TextComponent (plugin .text ().of (player , "menu.item-holochat-error" ).forLocale ());
233+
234+ String json ;
235+ try {
236+ json = ReflectFactory .convertBukkitItemStackToJson (itemStack );
237+ } catch (Exception throwable ) {
238+ plugin .getLogger ().log (Level .SEVERE , "Failed to saving item to json for holochat" , throwable );
239+ return new QuickComponentImpl (errorComponent );
240+ }
241+ if (json == null ) {
242+ return new QuickComponentImpl (errorComponent );
243+ }
244+
245+ TextComponent component = new TextComponent (normalText + " " + plugin .text ().of (player , "menu.preview" ).forLocale ());
246+ ComponentBuilder cBuilder = new ComponentBuilder (json );
247+ component .setHoverEvent (new HoverEvent (HoverEvent .Action .SHOW_ITEM , cBuilder .create ()));
248+ return new QuickComponentImpl (component );
249+
250+ }
251+
252+ public String getIndexStr (int index ) {
253+ return index <= 9 ? indexStrCache [index ] : "{" + index + "}" ;
254+ }
255+
256+ @ Override
257+ public void sendExecutableChat (@ NotNull CommandSender receiver , @ NotNull String message , Map .Entry <String , String >... textToCommandMapping ) {
258+ List <BaseComponent > components = new ArrayList <>(Arrays .asList (fromLegacyText (message )));
259+ Iterator <Map .Entry <String , String >> iterator = Arrays .asList (textToCommandMapping ).iterator ();
260+
261+ int index = 0 ;
262+ replace :
263+ while (iterator .hasNext ()) {
264+ Map .Entry <String , String > replacement = iterator .next ();
265+ for (int i = 0 ; i < components .size (); i ++) {
266+ BaseComponent component = components .get (i );
267+ if (component instanceof TextComponent ) {
268+ String text = ((TextComponent ) component ).getText ();
269+ if (text .contains (getIndexStr (index ))) {
270+ String [] strings = text .split (getIndexStr (index ).replace ("{" , "\\ {" ).replace ("}" , "\\ }" ), 2 );
271+ TextComponent component1 = new TextComponent (strings [0 ]);
272+ TextComponent component2 = new TextComponent (strings [1 ]);
273+ component1 .copyFormatting (component );
274+ component2 .copyFormatting (component );
275+ BaseComponent [] replacementComponents = fromLegacyText (replacement .getKey ());
276+ ClickEvent clickEvent = new ClickEvent (ClickEvent .Action .RUN_COMMAND , replacement .getValue ());
277+ HoverEvent hoverEvent = new HoverEvent (HoverEvent .Action .SHOW_TEXT , fromLegacyText (replacement .getKey ()));
278+ for (BaseComponent baseComponent : replacementComponents ) {
279+ baseComponent .setClickEvent (clickEvent );
280+ baseComponent .setHoverEvent (hoverEvent );
281+ component1 .addExtra (baseComponent );
282+ }
283+ components .remove (i );
284+ components .add (i , component2 );
285+ components .add (i , component1 );
286+ index ++;
287+ continue replace ;
288+ }
289+ }
290+ }
291+ }
292+ receiver .spigot ().sendMessage (components .toArray (new BaseComponent [0 ]));
293+ }
294+
295+ @ Override
296+ public void sendExecutableChat (@ NotNull CommandSender receiver , @ NotNull String message , @ NotNull String hoverText , @ NotNull String command ) {
297+ BaseComponent [] components =
298+ fromLegacyText (ChatColor .DARK_PURPLE + plugin .text ().of (receiver , "tableformat.left_begin" ).forLocale () + message );
299+ ClickEvent clickEvent = new ClickEvent (ClickEvent .Action .RUN_COMMAND , command );
300+ //FIXME: Update this when drop 1.15 supports
301+ HoverEvent hoverEvent = new HoverEvent (HoverEvent .Action .SHOW_TEXT , fromLegacyText (hoverText ));
302+ for (BaseComponent component : components ) {
303+ component .setClickEvent (clickEvent );
304+ component .setHoverEvent (
305+ hoverEvent ); //FIXME: Update this when drop 1.15 supports
306+ }
307+ receiver .spigot ().sendMessage (components );
308+ }
309+
310+ @ Override
311+ public void sendSuggestedChat (@ NotNull CommandSender receiver , @ NotNull String message , @ NotNull String hoverText , @ NotNull String command ) {
312+ BaseComponent [] components =
313+ fromLegacyText (ChatColor .DARK_PURPLE + plugin .text ().of (receiver , "tableformat.left_begin" ).forLocale () + message );
314+ ClickEvent clickEvent = new ClickEvent (ClickEvent .Action .SUGGEST_COMMAND , command );
315+ //FIXME: Update this when drop 1.15 supports
316+ HoverEvent hoverEvent = new HoverEvent (HoverEvent .Action .SHOW_TEXT , fromLegacyText (hoverText ));
317+ for (BaseComponent component : components ) {
318+ component .setClickEvent (clickEvent );
319+ component .setHoverEvent (hoverEvent );
320+ }
321+ receiver .spigot ().sendMessage (components );
322+ }
229323
230324 public static class BungeeComponentBuilder {
325+ private static final boolean isUsingResetCommitVersion = Util
326+ .isMethodAvailable (BaseComponent .class , "isReset" );
231327 private final ComponentBuilder builder ;
232328
233329 public BungeeComponentBuilder () {
@@ -237,9 +333,9 @@ public BungeeComponentBuilder() {
237333
238334 public BungeeComponentBuilder append (BaseComponent component ) {
239335 if (builder .getCursor () == -1 ) {
240- builder . append (component , ComponentBuilder .FormatRetention .EVENTS );
336+ append (component , ComponentBuilder .FormatRetention .EVENTS );
241337 } else {
242- builder . append (component );
338+ append (component );
243339 }
244340 return this ;
245341 }
@@ -254,9 +350,9 @@ public BungeeComponentBuilder append(BaseComponent[] components) {
254350
255351 public BungeeComponentBuilder append (String text ) {
256352 if (builder .getCursor () == -1 ) {
257- builder . append (text , ComponentBuilder .FormatRetention .EVENTS );
353+ append (text , ComponentBuilder .FormatRetention .EVENTS );
258354 } else {
259- builder . append (text );
355+ append (text , ComponentBuilder . FormatRetention . ALL );
260356 }
261357 return this ;
262358 }
@@ -269,7 +365,7 @@ public BungeeComponentBuilder appendLegacy(String... text) {
269365 for (int i = 1 ; i < text .length ; i ++) {
270366 stringBuilder .append (text [i ]);
271367 }
272- builder . append (fromLegacyText (stringBuilder .toString ()), ComponentBuilder .FormatRetention .EVENTS );
368+ append (fromLegacyText (stringBuilder .toString ()), ComponentBuilder .FormatRetention .EVENTS );
273369 return this ;
274370 }
275371
@@ -289,17 +385,18 @@ public BungeeComponentBuilder appendLegacyAndItem(String left, BaseComponent[] i
289385 for (BaseComponent baseComponent : itemsComponent ) {
290386 leftComponent .addExtra (baseComponent );
291387 }
292- builder . append (leftComponent , ComponentBuilder .FormatRetention .EVENTS );
293- builder . append (rightComponent , ComponentBuilder .FormatRetention .EVENTS );
388+ append (leftComponent , ComponentBuilder .FormatRetention .EVENTS );
389+ append (rightComponent , ComponentBuilder .FormatRetention .EVENTS );
294390 } else {
295- builder . append (component , ComponentBuilder .FormatRetention .EVENTS );
391+ append (component , ComponentBuilder .FormatRetention .EVENTS );
296392 }
297393 }
298394 return this ;
299395 }
300396
397+
301398 public BungeeComponentBuilder appendLegacy (String text ) {
302- builder . append (fromLegacyText (text ), ComponentBuilder .FormatRetention .EVENTS );
399+ append (fromLegacyText (text ), ComponentBuilder .FormatRetention .EVENTS );
303400 return this ;
304401 }
305402
@@ -325,101 +422,43 @@ public BaseComponent[] create() {
325422 public ComponentBuilder color (net .md_5 .bungee .api .ChatColor color ) {
326423 return builder .color (color );
327424 }
328- }
329-
330- @ Override
331- public @ NotNull QuickComponent getItemTextComponent (@ NotNull Player player , @ NotNull ItemStack itemStack , @ NotNull String normalText ) {
332- TextComponent errorComponent = new TextComponent (plugin .text ().of (player , "menu.item-holochat-error" ).forLocale ());
333-
334- String json ;
335- try {
336- json = ReflectFactory .convertBukkitItemStackToJson (itemStack );
337- } catch (Exception throwable ) {
338- plugin .getLogger ().log (Level .SEVERE , "Failed to saving item to json for holochat" , throwable );
339- return new QuickComponentImpl (errorComponent );
340- }
341- if (json == null ) {
342- return new QuickComponentImpl (errorComponent );
343- }
344-
345- TextComponent component = new TextComponent (normalText + " " + plugin .text ().of (player , "menu.preview" ).forLocale ());
346- ComponentBuilder cBuilder = new ComponentBuilder (json );
347- component .setHoverEvent (new HoverEvent (HoverEvent .Action .SHOW_ITEM , cBuilder .create ()));
348- return new QuickComponentImpl (component );
349-
350- }
351425
352- private final String [] indexStrCache = {"{0}" , "{1}" , "{2}" , "{3}" , "{4}" , "{5}" , "{6}" , "{7}" , "{8}" , "{9}" };
353-
354- public String getIndexStr (int index ) {
355- return index <= 9 ? indexStrCache [index ] : "{" + index + "}" ;
356- }
426+ /**
427+ * The dump method for fixing append always care about reset
428+ */
429+ //dump start
430+ private ComponentBuilder append (BaseComponent component , ComponentBuilder .FormatRetention retention ) {
431+ if (!isUsingResetCommitVersion ) {
432+ builder .append (component , retention );
433+ }
357434
358- @ Override
359- public void sendExecutableChat (@ NotNull CommandSender receiver , @ NotNull String message , Map .Entry <String , String >... textToCommandMapping ) {
360- List <BaseComponent > components = new ArrayList <>(Arrays .asList (fromLegacyText (message )));
361- Iterator <Map .Entry <String , String >> iterator = Arrays .asList (textToCommandMapping ).iterator ();
435+ List <BaseComponent > parts = builder .getParts ();
436+ BaseComponent previous = (parts .isEmpty ()) ? null : parts .get (parts .size () - 1 );
362437
363- int index = 0 ;
364- replace :
365- while (iterator .hasNext ()) {
366- Map .Entry <String , String > replacement = iterator .next ();
367- for (int i = 0 ; i < components .size (); i ++) {
368- BaseComponent component = components .get (i );
369- if (component instanceof TextComponent ) {
370- String text = ((TextComponent ) component ).getText ();
371- if (text .contains (getIndexStr (index ))) {
372- String [] strings = text .split (getIndexStr (index ).replace ("{" , "\\ {" ).replace ("}" , "\\ }" ), 2 );
373- TextComponent component1 = new TextComponent (strings [0 ]);
374- TextComponent component2 = new TextComponent (strings [1 ]);
375- component1 .copyFormatting (component );
376- component2 .copyFormatting (component );
377- BaseComponent [] replacementComponents = fromLegacyText (replacement .getKey ());
378- ClickEvent clickEvent = new ClickEvent (ClickEvent .Action .RUN_COMMAND , replacement .getValue ());
379- HoverEvent hoverEvent = new HoverEvent (HoverEvent .Action .SHOW_TEXT , fromLegacyText (replacement .getKey ()));
380- for (BaseComponent baseComponent : replacementComponents ) {
381- baseComponent .setClickEvent (clickEvent );
382- baseComponent .setHoverEvent (hoverEvent );
383- component1 .addExtra (baseComponent );
384- }
385- components .remove (i );
386- components .add (i , component2 );
387- components .add (i , component1 );
388- index ++;
389- continue replace ;
390- }
391- }
438+ if (component .isReset () && retention == ComponentBuilder .FormatRetention .ALL ) {
439+ retention = ComponentBuilder .FormatRetention .EVENTS ;
392440 }
441+ if (previous != null && (!component .isReset () || retention == ComponentBuilder .FormatRetention .EVENTS )) {
442+ component .copyFormatting (previous , retention , false );
443+ parts .add (component );
444+ builder .resetCursor ();
445+ } else {
446+ //follow the original logic
447+ builder .append (component , retention );
448+ }
449+ return builder ;
393450 }
394- receiver .spigot ().sendMessage (components .toArray (new BaseComponent [0 ]));
395- }
396451
397- @ Override
398- public void sendExecutableChat (@ NotNull CommandSender receiver , @ NotNull String message , @ NotNull String hoverText , @ NotNull String command ) {
399- BaseComponent [] components =
400- fromLegacyText (ChatColor .DARK_PURPLE + plugin .text ().of (receiver , "tableformat.left_begin" ).forLocale () + message );
401- ClickEvent clickEvent = new ClickEvent (ClickEvent .Action .RUN_COMMAND , command );
402- //FIXME: Update this when drop 1.15 supports
403- HoverEvent hoverEvent = new HoverEvent (HoverEvent .Action .SHOW_TEXT , fromLegacyText (hoverText ));
404- for (BaseComponent component : components ) {
405- component .setClickEvent (clickEvent );
406- component .setHoverEvent (
407- hoverEvent ); //FIXME: Update this when drop 1.15 supports
452+ private ComponentBuilder append (String text , ComponentBuilder .FormatRetention retention ) {
453+ return append (new TextComponent (text ), retention );
408454 }
409- receiver .spigot ().sendMessage (components );
410- }
411455
412- @ Override
413- public void sendSuggestedChat (@ NotNull CommandSender receiver , @ NotNull String message , @ NotNull String hoverText , @ NotNull String command ) {
414- BaseComponent [] components =
415- fromLegacyText (ChatColor .DARK_PURPLE + plugin .text ().of (receiver , "tableformat.left_begin" ).forLocale () + message );
416- ClickEvent clickEvent = new ClickEvent (ClickEvent .Action .SUGGEST_COMMAND , command );
417- //FIXME: Update this when drop 1.15 supports
418- HoverEvent hoverEvent = new HoverEvent (HoverEvent .Action .SHOW_TEXT , fromLegacyText (hoverText ));
419- for (BaseComponent component : components ) {
420- component .setClickEvent (clickEvent );
421- component .setHoverEvent (hoverEvent );
456+ private ComponentBuilder append (BaseComponent [] components , ComponentBuilder .FormatRetention retention ) {
457+ for (BaseComponent component : components ) {
458+ append (component , retention );
459+ }
460+ return builder ;
422461 }
423- receiver . spigot (). sendMessage ( components );
462+ //dump end
424463 }
425464}
0 commit comments