|
|
|
|
@@ -25,39 +25,53 @@
|
|
|
|
|
package net.runelite.client.plugins.chathistory;
|
|
|
|
|
|
|
|
|
|
import com.google.common.collect.EvictingQueue;
|
|
|
|
|
import com.google.common.collect.Sets;
|
|
|
|
|
import java.awt.event.KeyEvent;
|
|
|
|
|
import java.util.ArrayDeque;
|
|
|
|
|
import java.util.Deque;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.Queue;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import javax.inject.Inject;
|
|
|
|
|
import net.runelite.api.ChatMessageType;
|
|
|
|
|
import net.runelite.api.Client;
|
|
|
|
|
import net.runelite.api.ScriptID;
|
|
|
|
|
import net.runelite.api.VarClientInt;
|
|
|
|
|
import net.runelite.api.VarClientStr;
|
|
|
|
|
import net.runelite.api.events.ChatMessage;
|
|
|
|
|
import net.runelite.api.events.MenuOptionClicked;
|
|
|
|
|
import net.runelite.api.vars.InputType;
|
|
|
|
|
import net.runelite.client.callback.ClientThread;
|
|
|
|
|
import net.runelite.client.chat.ChatMessageManager;
|
|
|
|
|
import net.runelite.client.chat.QueuedMessage;
|
|
|
|
|
import net.runelite.client.eventbus.Subscribe;
|
|
|
|
|
import net.runelite.client.input.KeyListener;
|
|
|
|
|
import net.runelite.client.input.KeyManager;
|
|
|
|
|
import net.runelite.client.plugins.Plugin;
|
|
|
|
|
import net.runelite.client.plugins.PluginDescriptor;
|
|
|
|
|
import net.runelite.client.util.Text;
|
|
|
|
|
|
|
|
|
|
@PluginDescriptor(
|
|
|
|
|
name = "Chat History",
|
|
|
|
|
description = "Retain your chat history when logging in/out or world hopping"
|
|
|
|
|
description = "Retain your chat history when logging in/out or world hopping",
|
|
|
|
|
tags = {"chat", "history", "retain", "cycle", "pm"}
|
|
|
|
|
)
|
|
|
|
|
public class ChatHistoryPlugin extends Plugin
|
|
|
|
|
public class ChatHistoryPlugin extends Plugin implements KeyListener
|
|
|
|
|
{
|
|
|
|
|
private static final String WELCOME_MESSAGE = "Welcome to Old School RuneScape.";
|
|
|
|
|
private static final String CLEAR_HISTORY = "Clear history";
|
|
|
|
|
private static final String CLEAR_PRIVATE = "<col=ffff00>Private:";
|
|
|
|
|
private static final Set<ChatMessageType> ALLOWED_HISTORY = Sets.newHashSet(
|
|
|
|
|
ChatMessageType.PUBLIC,
|
|
|
|
|
ChatMessageType.PUBLIC_MOD,
|
|
|
|
|
ChatMessageType.CLANCHAT,
|
|
|
|
|
ChatMessageType.PRIVATE_MESSAGE_RECEIVED,
|
|
|
|
|
ChatMessageType.PRIVATE_MESSAGE_SENT,
|
|
|
|
|
ChatMessageType.PRIVATE_MESSAGE_RECEIVED_MOD,
|
|
|
|
|
ChatMessageType.GAME
|
|
|
|
|
);
|
|
|
|
|
private static final int CYCLE_HOTKEY = KeyEvent.VK_TAB;
|
|
|
|
|
|
|
|
|
|
private Queue<QueuedMessage> messageQueue;
|
|
|
|
|
private Deque<String> friends;
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
|
private Client client;
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
|
private ClientThread clientThread;
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
|
private KeyManager keyManager;
|
|
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
|
private ChatMessageManager chatMessageManager;
|
|
|
|
|
@@ -66,6 +80,8 @@ public class ChatHistoryPlugin extends Plugin
|
|
|
|
|
protected void startUp()
|
|
|
|
|
{
|
|
|
|
|
messageQueue = EvictingQueue.create(100);
|
|
|
|
|
friends = new ArrayDeque<>(5);
|
|
|
|
|
keyManager.registerKeyListener(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@@ -73,6 +89,9 @@ public class ChatHistoryPlugin extends Plugin
|
|
|
|
|
{
|
|
|
|
|
messageQueue.clear();
|
|
|
|
|
messageQueue = null;
|
|
|
|
|
friends.clear();
|
|
|
|
|
friends = null;
|
|
|
|
|
keyManager.unregisterKeyListener(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Subscribe
|
|
|
|
|
@@ -92,21 +111,33 @@ public class ChatHistoryPlugin extends Plugin
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ALLOWED_HISTORY.contains(chatMessage.getType()))
|
|
|
|
|
switch (chatMessage.getType())
|
|
|
|
|
{
|
|
|
|
|
final QueuedMessage queuedMessage = QueuedMessage.builder()
|
|
|
|
|
.type(chatMessage.getType())
|
|
|
|
|
.name(chatMessage.getName())
|
|
|
|
|
.sender(chatMessage.getSender())
|
|
|
|
|
.value(nbsp(chatMessage.getMessage()))
|
|
|
|
|
.runeLiteFormattedMessage(nbsp(chatMessage.getMessageNode().getRuneLiteFormatMessage()))
|
|
|
|
|
.timestamp(chatMessage.getTimestamp())
|
|
|
|
|
.build();
|
|
|
|
|
case PRIVATE_MESSAGE_SENT:
|
|
|
|
|
case PRIVATE_MESSAGE_RECEIVED:
|
|
|
|
|
case PRIVATE_MESSAGE_RECEIVED_MOD:
|
|
|
|
|
final String name = Text.removeTags(chatMessage.getName());
|
|
|
|
|
// Remove to ensure uniqueness & its place in history
|
|
|
|
|
friends.remove(name);
|
|
|
|
|
friends.add(name);
|
|
|
|
|
// intentional fall-through
|
|
|
|
|
case PUBLIC:
|
|
|
|
|
case PUBLIC_MOD:
|
|
|
|
|
case CLANCHAT:
|
|
|
|
|
case GAME:
|
|
|
|
|
final QueuedMessage queuedMessage = QueuedMessage.builder()
|
|
|
|
|
.type(chatMessage.getType())
|
|
|
|
|
.name(chatMessage.getName())
|
|
|
|
|
.sender(chatMessage.getSender())
|
|
|
|
|
.value(nbsp(chatMessage.getMessage()))
|
|
|
|
|
.runeLiteFormattedMessage(nbsp(chatMessage.getMessageNode().getRuneLiteFormatMessage()))
|
|
|
|
|
.timestamp(chatMessage.getTimestamp())
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
if (!messageQueue.contains(queuedMessage))
|
|
|
|
|
{
|
|
|
|
|
messageQueue.offer(queuedMessage);
|
|
|
|
|
}
|
|
|
|
|
if (!messageQueue.contains(queuedMessage))
|
|
|
|
|
{
|
|
|
|
|
messageQueue.offer(queuedMessage);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -143,4 +174,64 @@ public class ChatHistoryPlugin extends Plugin
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void keyPressed(KeyEvent e)
|
|
|
|
|
{
|
|
|
|
|
if (e.getKeyCode() != CYCLE_HOTKEY)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (client.getVar(VarClientInt.INPUT_TYPE) != InputType.PRIVATE_MESSAGE.getType())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clientThread.invoke(() ->
|
|
|
|
|
{
|
|
|
|
|
final String target = findPreviousFriend();
|
|
|
|
|
if (target == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final String currentMessage = client.getVar(VarClientStr.INPUT_TEXT);
|
|
|
|
|
|
|
|
|
|
client.runScript(ScriptID.OPEN_PRIVATE_MESSAGE_INTERFACE, target);
|
|
|
|
|
|
|
|
|
|
client.setVar(VarClientStr.INPUT_TEXT, currentMessage);
|
|
|
|
|
client.runScript(ScriptID.CHAT_TEXT_INPUT_REBUILD, "");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void keyTyped(KeyEvent e)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void keyReleased(KeyEvent e)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String findPreviousFriend()
|
|
|
|
|
{
|
|
|
|
|
final String currentTarget = client.getVar(VarClientStr.PRIVATE_MESSAGE_TARGET);
|
|
|
|
|
if (currentTarget == null || friends.isEmpty())
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (Iterator<String> it = friends.descendingIterator(); it.hasNext(); )
|
|
|
|
|
{
|
|
|
|
|
String friend = it.next();
|
|
|
|
|
if (friend.equals(currentTarget))
|
|
|
|
|
{
|
|
|
|
|
return it.hasNext() ? it.next() : friends.getLast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return friends.getLast();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|