chat message manager: don't apply color changes to message nodes

Apply the color changes at chat build time directly to the message being
set on the component, instead of prepending the color change onto the
message itself.

This is a bit more robust since it doesn't break things which depend on
the chat message not starting with a color, which they would not
otherwise, such as the chat filter.
This commit is contained in:
Adam
2021-11-26 20:19:13 -05:00
parent 79cf2cb271
commit 90f200be53
4 changed files with 81 additions and 50 deletions

View File

@@ -31,14 +31,16 @@ import com.google.inject.testing.fieldbinder.BoundFieldModule;
import java.awt.Color;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.IterableHashTable;
import net.runelite.api.MessageNode;
import net.runelite.api.Player;
import net.runelite.api.events.ChatMessage;
import net.runelite.client.config.ChatColorConfig;
import net.runelite.client.events.ConfigChanged;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.mockito.ArgumentMatchers.anyLong;
import org.mockito.Mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -59,12 +61,39 @@ public class ChatMessageManagerTest
@Inject
private ChatMessageManager chatMessageManager;
private String[] sstack;
private int[] istack;
@Before
public void before()
{
Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this);
}
private void setupVm(ChatMessageType type, String name, String message)
{
MessageNode messageNode = mock(MessageNode.class);
when(messageNode.getType()).thenReturn(type);
IterableHashTable<MessageNode> tbl = mock(IterableHashTable.class);
when(tbl.get(anyLong())).thenReturn(messageNode);
when(client.getMessages()).thenReturn(tbl);
sstack = new String[]{
"",
name,
message,
""
};
istack = new int[]{
1
};
when(client.getStringStack()).thenReturn(sstack);
when(client.getStringStackSize()).thenReturn(sstack.length);
when(client.getIntStack()).thenReturn(istack);
when(client.getIntStackSize()).thenReturn(istack.length);
}
@Test
public void testMessageRecoloring()
{
@@ -75,16 +104,10 @@ public class ChatMessageManagerTest
configChanged.setGroup("textrecolor");
chatMessageManager.onConfigChanged(configChanged);
ChatMessage chatMessage = new ChatMessage();
chatMessage.setType(ChatMessageType.GAMEMESSAGE);
setupVm(ChatMessageType.GAMEMESSAGE, "", "Your dodgy necklace protects you. It has <col=ff0000>1</col> charge left.");
chatMessageManager.colorChatMessage();
MessageNode messageNode = mock(MessageNode.class);
chatMessage.setMessageNode(messageNode);
when(messageNode.getValue()).thenReturn("Your dodgy necklace protects you. It has <col=ff0000>1</col> charge left.");
chatMessageManager.onChatMessage(chatMessage);
verify(messageNode).setValue("<col=b20000>Your dodgy necklace protects you. It has <col=ff0000>1<col=b20000> charge left.</col>");
assertEquals("<col=b20000>Your dodgy necklace protects you. It has <col=ff0000>1<col=b20000> charge left.</col>", sstack[2]);
}
@Test
@@ -95,14 +118,7 @@ public class ChatMessageManagerTest
when(chatColorConfig.opaquePublicFriendUsernames()).thenReturn(Color.decode("#b20000"));
// Setup message
ChatMessage chatMessage = new ChatMessage();
chatMessage.setType(ChatMessageType.PUBLICCHAT);
chatMessage.setName(friendName);
MessageNode messageNode = mock(MessageNode.class);
chatMessage.setMessageNode(messageNode);
when(messageNode.getName()).thenReturn(friendName);
setupVm(ChatMessageType.PUBLICCHAT, friendName, "");
// Setup friend checking
Player localPlayer = mock(Player.class);
@@ -111,9 +127,9 @@ public class ChatMessageManagerTest
when(client.getLocalPlayer()).thenReturn(localPlayer);
when(localPlayer.getName()).thenReturn(localPlayerName);
chatMessageManager.onChatMessage(chatMessage);
chatMessageManager.colorChatMessage();
verify(messageNode).setName("<col=b20000>" + friendName + "</col>");
assertEquals("<col=b20000>" + friendName + "</col>", sstack[1]);
}
@Test
@@ -125,14 +141,7 @@ public class ChatMessageManagerTest
when(chatColorConfig.opaquePublicFriendUsernames()).thenReturn(Color.decode("#b20000"));
// Setup message
ChatMessage chatMessage = new ChatMessage();
chatMessage.setType(ChatMessageType.PUBLICCHAT);
chatMessage.setName(friendName);
MessageNode messageNode = mock(MessageNode.class);
chatMessage.setMessageNode(messageNode);
when(messageNode.getName()).thenReturn(friendName);
setupVm(ChatMessageType.PUBLICCHAT, friendName, "");
// Setup friend checking
Player localPlayer = mock(Player.class);
@@ -141,9 +150,9 @@ public class ChatMessageManagerTest
when(client.getLocalPlayer()).thenReturn(localPlayer);
when(localPlayer.getName()).thenReturn(localPlayerName);
chatMessageManager.onChatMessage(chatMessage);
chatMessageManager.colorChatMessage();
verify(messageNode).setName("<col=b20000>" + friendName + "</col>");
assertEquals("<col=b20000>" + friendName + "</col>", sstack[1]);
}
@Test