diff --git a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java index fcc1b2d17d..b563773915 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/ChatMessageManager.java @@ -564,6 +564,8 @@ public class ChatMessageManager // Update the message with RuneLite additions line.setRuneLiteFormatMessage(message.getRuneLiteFormattedMessage()); + line.setTimestamp(message.getTimestamp()); + update(line); } diff --git a/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java b/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java index cc3bce295b..9c88826af7 100644 --- a/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java +++ b/runelite-client/src/main/java/net/runelite/client/chat/QueuedMessage.java @@ -37,4 +37,5 @@ public class QueuedMessage private String name; private String sender; private String runeLiteFormattedMessage; + private int timestamp; } diff --git a/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java index 0bcf67341c..f17cb53415 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ChatColorConfig.java @@ -509,4 +509,22 @@ public interface ChatColorConfig extends Config description = "Color of Friend Usernames in Public Chat (transparent)" ) Color transparentPublicFriendUsernames(); + + //Plugin specific chat colours + + @ConfigItem( + position = 88, + keyName = "opaqueTimestamp", + name = "Timestamps (opaque)", + description = "Colour of Timestamps from the Timestamps plugin (opaque)" + ) + Color opaqueTimestamp(); + + @ConfigItem( + position = 89, + keyName = "transparentTimestamp", + name = "Timestamps (transparent)", + description = "Colour of Timestamps from the Timestamps plugin (transparent)" + ) + Color transparentTimestamp(); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java index 273085f202..4f2ae79818 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java @@ -100,6 +100,7 @@ public class ChatHistoryPlugin extends Plugin .sender(message.getSender()) .value(nbsp(message.getValue())) .runeLiteFormattedMessage(nbsp(message.getMessageNode().getRuneLiteFormatMessage())) + .timestamp(message.getTimestamp()) .build(); if (!messageQueue.contains(queuedMessage)) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java new file mode 100644 index 0000000000..ee1c53a791 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timestamp/TimestampPlugin.java @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2018, Magic fTail + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.timestamp; + +import java.awt.Color; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoField; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.MessageNode; +import net.runelite.api.Varbits; +import net.runelite.api.events.ScriptCallbackEvent; +import net.runelite.client.config.ChatColorConfig; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.util.ColorUtil; + +@PluginDescriptor( + name = "Chat Timestamps", + description = "Add timestamps to chat messages", + tags = {"timestamp"}, + enabledByDefault = false +) +public class TimestampPlugin extends Plugin +{ + @Inject + private Client client; + + @Inject + private ChatColorConfig chatColorConfig; + + @Subscribe + public void onScriptCallbackEvent(ScriptCallbackEvent event) + { + if (!event.getEventName().equals("addTimestamp")) + { + return; + } + + int[] intStack = client.getIntStack(); + int intStackSize = client.getIntStackSize(); + + String[] stringStack = client.getStringStack(); + int stringStackSize = client.getStringStackSize(); + + int messageId = intStack[intStackSize - 1]; + + MessageNode messageNode = (MessageNode) client.getMessages().get(messageId); + + final ZonedDateTime time = ZonedDateTime.ofInstant( + Instant.ofEpochSecond(messageNode.getTimestamp()), ZoneId.systemDefault()); + + final String dateFormat = time.get(ChronoField.HOUR_OF_DAY) + ":" + + String.format("%02d", time.get(ChronoField.MINUTE_OF_HOUR)); + + String timestamp = "[" + dateFormat + "]"; + + Color timestampColour = getTimestampColour(); + if (timestampColour != null) + { + timestamp = ColorUtil.wrapWithColorTag(timestamp, timestampColour); + } + + stringStack[stringStackSize - 1] = timestamp; + } + + private Color getTimestampColour() + { + boolean isChatboxTransparent = client.isResized() && client.getVar(Varbits.TRANSPARENT_CHATBOX) == 1; + + return isChatboxTransparent ? chatColorConfig.transparentTimestamp() : chatColorConfig.opaqueTimestamp(); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/scripts/ChatBuilder.rs2asm b/runelite-client/src/main/scripts/ChatBuilder.rs2asm index 0a0b39e5f0..2e0b41bec1 100644 --- a/runelite-client/src/main/scripts/ChatBuilder.rs2asm +++ b/runelite-client/src/main/scripts/ChatBuilder.rs2asm @@ -216,9 +216,14 @@ LABEL183: 91: LABEL207 jump LABEL426 LABEL186: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int sload 9 load_string ":" - string_append 2 + string_append 3 ; We need to append an extra string since we added the timestamp sload 1 sload 11 load_string "" @@ -238,9 +243,14 @@ LABEL186: istore 6 jump LABEL440 LABEL207: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int sload 9 load_string ":" - string_append 2 + string_append 3 ; We need to append an extra string since we added the timestamp sload 3 sload 11 load_string "" @@ -260,12 +270,17 @@ LABEL207: istore 6 jump LABEL440 LABEL228: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int load_string "From " sload 9 load_string ":" load_string "privateChatFrom" runelite_callback - string_append 3 + string_append 4 ; We need to append an extra string since we added the timestamp sload 2 sload 11 load_string "" @@ -285,10 +300,15 @@ LABEL228: istore 6 jump LABEL440 LABEL250: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int sload 7 sload 11 load_string "" - string_append 3 + string_append 4 ; We need to append an extra string since we added the timestamp iload 7 iload 8 load_int 10616890 @@ -304,10 +324,15 @@ LABEL250: istore 6 jump LABEL440 LABEL268: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int sload 2 sload 11 load_string "" - string_append 3 + string_append 4 ; We need to append an extra string since we added the timestamp iload 7 iload 8 load_int 10616890 @@ -340,12 +365,17 @@ LABEL289: LABEL300: jump LABEL440 LABEL301: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int load_string "To " sload 9 load_string ":" load_string "privateChatTo" runelite_callback - string_append 3 + string_append 4 ; We need to append an extra string since we added the timestamp sload 2 sload 11 load_string "" @@ -365,10 +395,15 @@ LABEL301: istore 6 jump LABEL440 LABEL323: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int sload 8 sload 11 load_string "" - string_append 3 + string_append 4 ; We need to append an extra string since we added the timestamp iload 7 iload 8 load_int 10616890 @@ -384,6 +419,11 @@ LABEL323: istore 6 jump LABEL440 LABEL341: + iload 9 ; The id of the messageNode of the message being built + load_string "" + load_string "addTimestamp" + runelite_callback + pop_int load_string "[" sload 5 sload 10 @@ -391,7 +431,7 @@ LABEL341: load_string "] " sload 9 load_string ":" - string_append 7 + string_append 8 ; We need to append an extra string since we added the timestamp sload 6 sload 11 load_string ""