Skip to content

Commit 02081b4

Browse files
authored
Merge pull request #3305 from Multiverse/fix/text-format-null
Fix ChatTextFormatter handling null strings
2 parents 8bc3a59 + 4553967 commit 02081b4

File tree

7 files changed

+62
-34
lines changed

7 files changed

+62
-34
lines changed

src/main/java/org/mvplugins/multiverse/core/display/filters/RegexContentFilter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,12 @@ public boolean checkMatch(String value) {
6969
if (!hasValidRegex()) {
7070
return false;
7171
}
72-
String text = ChatTextFormatter.removeColor(String.valueOf(value)).toLowerCase();
72+
String text = ChatTextFormatter.removeColor(String.valueOf(value));
73+
if (text == null) {
74+
return false;
75+
}
7376
try {
74-
return regexPattern.matcher(text).find();
77+
return regexPattern.matcher(text.toLowerCase()).find();
7578
} catch (PatternSyntaxException ignored) {
7679
Logging.warning("Error parsing regex '%s' for input '%s'", regexString, text);
7780
return false;

src/main/java/org/mvplugins/multiverse/core/listeners/MVChatListener.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,9 @@ void asyncPlayerChat(AsyncPlayerChatEvent event) {
8888
String prefixChatFormat = config.getPrefixChatFormat();
8989
prefixChatFormat = prefixChatFormat.replace("%world%", worldName).replace("%chat%", chat);
9090
prefixChatFormat = ChatTextFormatter.colorize(prefixChatFormat);
91-
92-
event.setFormat(prefixChatFormat);
91+
if (prefixChatFormat != null) {
92+
event.setFormat(prefixChatFormat);
93+
}
9394
}
9495

9596
private String getWorldName(Player player) {

src/main/java/org/mvplugins/multiverse/core/utils/text/AdventureTextFormatter.java

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,45 @@
44
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
55
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
66
import org.bukkit.command.CommandSender;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
79

810
final class AdventureTextFormatter implements TextFormatter {
911
@Override
10-
public void sendFormattedMessage(CommandSender sender, String message) {
11-
sender.sendMessage(colorize(message));
12+
public void sendFormattedMessage(@NotNull CommandSender sender, @Nullable String message) {
13+
String colorizedMessage = colorize(message);
14+
if (colorizedMessage == null) {
15+
return; // Avoid sending null messages
16+
}
17+
sender.sendMessage(colorizedMessage);
1218
}
1319

1420
@Override
15-
public String removeColor(String message) {
16-
TextComponent sectionComponent = LegacyComponentSerializer.legacySection().deserialize(colorize(message));
17-
return PlainTextComponentSerializer.plainText().serialize(sectionComponent);
21+
public @Nullable String removeColor(@Nullable String message) {
22+
TextComponent sectionComponent = LegacyComponentSerializer.legacySection().deserializeOrNull(colorize(message));
23+
return PlainTextComponentSerializer.plainText().serializeOrNull(sectionComponent);
1824
}
1925

20-
public String removeAmpColor(String message) {
21-
return PlainTextComponentSerializer.plainText().serialize(toAmpComponent(message));
26+
@Override
27+
public @Nullable String removeAmpColor(@Nullable String message) {
28+
return PlainTextComponentSerializer.plainText().serializeOrNull(toAmpComponent(message));
2229
}
2330

24-
public String removeSectionColor(String message) {
25-
return PlainTextComponentSerializer.plainText().serialize(toSectionComponent(message));
31+
@Override
32+
public @Nullable String removeSectionColor(@Nullable String message) {
33+
return PlainTextComponentSerializer.plainText().serializeOrNull(toSectionComponent(message));
2634
}
2735

2836
@Override
29-
public String colorize(String message) {
30-
return LegacyComponentSerializer.legacySection().serialize(toAmpComponent(message));
37+
public @Nullable String colorize(@Nullable String message) {
38+
return LegacyComponentSerializer.legacySection().serializeOrNull(toAmpComponent(message));
3139
}
3240

33-
private TextComponent toAmpComponent(String message) {
34-
return LegacyComponentSerializer.legacyAmpersand().deserialize(message);
41+
private @Nullable TextComponent toAmpComponent(@Nullable String message) {
42+
return LegacyComponentSerializer.legacyAmpersand().deserializeOrNull(message);
3543
}
3644

37-
private TextComponent toSectionComponent(String message) {
38-
return LegacyComponentSerializer.legacySection().deserialize(message);
45+
private @Nullable TextComponent toSectionComponent(@Nullable String message) {
46+
return LegacyComponentSerializer.legacySection().deserializeOrNull(message);
3947
}
4048
}

src/main/java/org/mvplugins/multiverse/core/utils/text/ChatColorTextFormatter.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,36 @@
22

33
import org.bukkit.ChatColor;
44
import org.bukkit.command.CommandSender;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
57

8+
@SuppressWarnings("deprecation")
69
final class ChatColorTextFormatter implements TextFormatter {
710
@Override
8-
public void sendFormattedMessage(CommandSender sender, String message) {
11+
public void sendFormattedMessage(@NotNull CommandSender sender, String message) {
912
sender.sendMessage(colorize(message));
1013
}
1114

1215
@Override
13-
public String removeColor(String message) {
16+
public @Nullable String removeColor(@Nullable String message) {
1417
return ChatColor.stripColor(colorize(message));
1518
}
1619

1720
@Override
18-
public String removeAmpColor(String message) {
21+
public @Nullable String removeAmpColor(@Nullable String message) {
1922
return removeColor(message);
2023
}
2124

2225
@Override
23-
public String removeSectionColor(String message) {
26+
public @Nullable String removeSectionColor(@Nullable String message) {
2427
return ChatColor.stripColor(message);
2528
}
2629

2730
@Override
28-
public String colorize(String message) {
31+
public @Nullable String colorize(@Nullable String message) {
32+
if (message == null) {
33+
return null;
34+
}
2935
return ChatColor.translateAlternateColorCodes('&', message);
3036
}
3137
}

src/main/java/org/mvplugins/multiverse/core/utils/text/ChatTextFormatter.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.bukkit.command.CommandSender;
44
import org.jetbrains.annotations.ApiStatus;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
57
import org.mvplugins.multiverse.core.utils.ReflectHelper;
68

79
/**
@@ -32,7 +34,7 @@ public final class ChatTextFormatter {
3234
* @since 5.1
3335
*/
3436
@ApiStatus.AvailableSince("5.1")
35-
public static void sendFormattedMessage(CommandSender sender, String message) {
37+
public static void sendFormattedMessage(@NotNull CommandSender sender, @Nullable String message) {
3638
wrapper.sendFormattedMessage(sender, message);
3739
}
3840

@@ -44,7 +46,7 @@ public static void sendFormattedMessage(CommandSender sender, String message) {
4446
*
4547
* @since 5.1
4648
*/
47-
public static String removeColor(String message) {
49+
public static @Nullable String removeColor(@Nullable String message) {
4850
return wrapper.removeColor(message);
4951
}
5052

@@ -57,7 +59,7 @@ public static String removeColor(String message) {
5759
* @since 5.1
5860
*/
5961
@ApiStatus.AvailableSince("5.1")
60-
public static String removeAmpColor(String message) {
62+
public static @Nullable String removeAmpColor(@Nullable String message) {
6163
return wrapper.removeAmpColor(message);
6264
}
6365

@@ -70,7 +72,7 @@ public static String removeAmpColor(String message) {
7072
* @since 5.1
7173
*/
7274
@ApiStatus.AvailableSince("5.1")
73-
public static String removeSectionColor(String message) {
75+
public static @Nullable String removeSectionColor(@Nullable String message) {
7476
return wrapper.removeSectionColor(message);
7577
}
7678

@@ -83,7 +85,7 @@ public static String removeSectionColor(String message) {
8385
* @since 5.1
8486
*/
8587
@ApiStatus.AvailableSince("5.1")
86-
public static String colorize(String message) {
88+
public static @Nullable String colorize(@Nullable String message) {
8789
return wrapper.colorize(message);
8890
}
8991
}
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package org.mvplugins.multiverse.core.utils.text;
22

33
import org.bukkit.command.CommandSender;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
46

57
interface TextFormatter {
6-
void sendFormattedMessage(CommandSender sender, String message);
8+
void sendFormattedMessage(@NotNull CommandSender sender, @Nullable String message);
79

8-
String removeColor(String message);
10+
@Nullable String removeColor(@Nullable String message);
911

10-
String removeAmpColor(String message);
12+
@Nullable String removeAmpColor(@Nullable String message);
1113

12-
String removeSectionColor(String message);
14+
@Nullable String removeSectionColor(@Nullable String message);
1315

14-
String colorize(String message);
16+
@Nullable String colorize(@Nullable String message);
1517
}

src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,9 @@ public Option<MultiverseWorld> getUnloadedWorldByNameOrAlias(@Nullable String wo
957957
}
958958

959959
private Option<MultiverseWorld> getUnloadedWorldByAlias(@Nullable String alias) {
960+
if (alias == null || alias.isEmpty()) {
961+
return Option.none();
962+
}
960963
String colourlessAlias = ChatTextFormatter.removeColor(alias);
961964
return Option.ofOptional(worldsMap.values().stream()
962965
.filter(world -> !world.isLoaded())
@@ -1027,6 +1030,9 @@ public Option<LoadedMultiverseWorld> getLoadedWorldByNameOrAlias(@Nullable Strin
10271030
}
10281031

10291032
private Option<LoadedMultiverseWorld> getLoadedWorldByAlias(@Nullable String alias) {
1033+
if (alias == null || alias.isEmpty()) {
1034+
return Option.none();
1035+
}
10301036
return Option.ofOptional(loadedWorldsMap.values().stream()
10311037
.filter(world -> world.getColourlessAlias()
10321038
.equalsIgnoreCase(ChatTextFormatter.removeColor(alias)))

0 commit comments

Comments
 (0)