diff --git a/runelite-api/src/main/java/net/runelite/api/MessageNode.java b/runelite-api/src/main/java/net/runelite/api/MessageNode.java index 0a89bc6dd6..3419d955ac 100644 --- a/runelite-api/src/main/java/net/runelite/api/MessageNode.java +++ b/runelite-api/src/main/java/net/runelite/api/MessageNode.java @@ -29,6 +29,13 @@ package net.runelite.api; */ public interface MessageNode { + /** + * Get the id for this message node + * + * @return + */ + int getId(); + /** * Gets the type of message. * @@ -95,4 +102,18 @@ public interface MessageNode * @param runeLiteFormatMessage the new message format */ void setRuneLiteFormatMessage(String runeLiteFormatMessage); + + /** + * Get the timestamp for the message, in seconds from the unix epoch. + * + * @return + */ + int getTimestamp(); + + /** + * Set the timestamp of the message + * + * @param timestamp + */ + void setTimestamp(int timestamp); } diff --git a/runelite-api/src/main/java/net/runelite/api/events/SetMessage.java b/runelite-api/src/main/java/net/runelite/api/events/SetMessage.java index 59da0aa662..0dde863bcc 100644 --- a/runelite-api/src/main/java/net/runelite/api/events/SetMessage.java +++ b/runelite-api/src/main/java/net/runelite/api/events/SetMessage.java @@ -36,4 +36,8 @@ public class SetMessage * The new message value. */ private String value; + /** + * Timestamp of the message. + */ + private int timestamp; } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSMessageNodeMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSMessageNodeMixin.java index d09b3a5780..c8ed6cc772 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSMessageNodeMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSMessageNodeMixin.java @@ -42,15 +42,21 @@ public abstract class RSMessageNodeMixin implements RSMessageNode @Inject private String runeLiteFormatMessage; + @Inject + private int rl$timestamp; + @Inject RSMessageNodeMixin() { + rl$timestamp = (int) (System.currentTimeMillis() / 1000L); + final SetMessage setMessage = new SetMessage(); setMessage.setMessageNode(this); setMessage.setType(getType()); setMessage.setName(getName()); setMessage.setSender(getSender()); setMessage.setValue(getValue()); + setMessage.setTimestamp(rl$timestamp); client.getCallbacks().post(setMessage); } @@ -75,6 +81,20 @@ public abstract class RSMessageNodeMixin implements RSMessageNode this.runeLiteFormatMessage = runeLiteFormatMessage; } + @Inject + @Override + public int getTimestamp() + { + return rl$timestamp; + } + + @Inject + @Override + public void setTimestamp(int timestamp) + { + this.rl$timestamp = timestamp; + } + @Inject @MethodHook(value = "setMessage", end = true) public void setMessage(int type, String name, String sender, String value) @@ -82,6 +102,7 @@ public abstract class RSMessageNodeMixin implements RSMessageNode // Message nodes get reused after a time by calling setMessage. // Clear the runelite formatted message then. runeLiteFormatMessage = null; + rl$timestamp = (int) (System.currentTimeMillis() / 1000L); final SetMessage setMessage = new SetMessage(); setMessage.setMessageNode(this); @@ -89,6 +110,7 @@ public abstract class RSMessageNodeMixin implements RSMessageNode setMessage.setName(name); setMessage.setSender(sender); setMessage.setValue(value); + setMessage.setTimestamp(rl$timestamp); client.getCallbacks().post(setMessage); } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSMessageNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSMessageNode.java index be3d845a48..f673e58c7a 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSMessageNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSMessageNode.java @@ -29,6 +29,10 @@ import net.runelite.mapping.Import; public interface RSMessageNode extends MessageNode { + @Import("id") + @Override + int getId(); + @Import("type") int getRSType();