Skip to content

Commit 5941646

Browse files
PotatoCraft-Studio#394 Fix wrong event format copying after SPIGOT-7091: Update bungeecord-chat
Introduce by https://github.com/SpigotMC/BungeeCord/pull/3344/files#diff-84a270b9ce33820f05d3564ab384e29478185dd8302836fbdc17ec17cd04b949R164 We use our own method to just press event, no sure if this should be open a pull request to upstream
1 parent ac4573a commit 5941646

File tree

1 file changed

+154
-115
lines changed

1 file changed

+154
-115
lines changed

src/main/java/org/maxgamer/quickshop/chat/platform/minedown/BungeeQuickChat.java

Lines changed: 154 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -61,28 +61,12 @@
6161
@AllArgsConstructor
6262
public 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

Comments
 (0)