@@ -172,4 +172,48 @@ public class ChatClient
|
||||
throw new IOException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean submitPb(String username, String boss, int pb) throws IOException
|
||||
{
|
||||
HttpUrl url = RuneLiteAPI.getApiBase().newBuilder()
|
||||
.addPathSegment("chat")
|
||||
.addPathSegment("pb")
|
||||
.addQueryParameter("name", username)
|
||||
.addQueryParameter("boss", boss)
|
||||
.addQueryParameter("pb", Integer.toString(pb))
|
||||
.build();
|
||||
|
||||
Request request = new Request.Builder()
|
||||
.post(RequestBody.create(null, new byte[0]))
|
||||
.url(url)
|
||||
.build();
|
||||
|
||||
try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
|
||||
{
|
||||
return response.isSuccessful();
|
||||
}
|
||||
}
|
||||
|
||||
public int getPb(String username, String boss) throws IOException
|
||||
{
|
||||
HttpUrl url = RuneLiteAPI.getApiBase().newBuilder()
|
||||
.addPathSegment("chat")
|
||||
.addPathSegment("pb")
|
||||
.addQueryParameter("name", username)
|
||||
.addQueryParameter("boss", boss)
|
||||
.build();
|
||||
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.build();
|
||||
|
||||
try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
|
||||
{
|
||||
if (!response.isSuccessful())
|
||||
{
|
||||
throw new IOException("Unable to look up personal best!");
|
||||
}
|
||||
return Integer.parseInt(response.body().string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ public class ChatController
|
||||
}
|
||||
|
||||
@GetMapping("/qp")
|
||||
public int getKc(@RequestParam String name)
|
||||
public int getQp(@RequestParam String name)
|
||||
{
|
||||
Integer kc = chatService.getQp(name);
|
||||
if (kc == null)
|
||||
@@ -133,4 +133,26 @@ public class ChatController
|
||||
{
|
||||
return chatService.getTask(name);
|
||||
}
|
||||
|
||||
@PostMapping("/pb")
|
||||
public void submitPb(@RequestParam String name, @RequestParam int pb)
|
||||
{
|
||||
if (pb < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
chatService.setPb(name, pb);
|
||||
}
|
||||
|
||||
@GetMapping("/pb")
|
||||
public int getPb(@RequestParam String name)
|
||||
{
|
||||
Integer pb = chatService.getPb(name);
|
||||
if (pb == null)
|
||||
{
|
||||
throw new NotFoundException();
|
||||
}
|
||||
return pb;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,4 +121,22 @@ public class ChatService
|
||||
jedis.expire(key, (int) EXPIRE.getSeconds());
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getPb(String name)
|
||||
{
|
||||
String value;
|
||||
try (Jedis jedis = jedisPool.getResource())
|
||||
{
|
||||
value = jedis.get("pb." + name);
|
||||
}
|
||||
return value == null ? null : Integer.parseInt(value);
|
||||
}
|
||||
|
||||
public void setPb(String name, int pb)
|
||||
{
|
||||
try (Jedis jedis = jedisPool.getResource())
|
||||
{
|
||||
jedis.setex("pb." + name, (int) EXPIRE.getSeconds(), Integer.toString(pb));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +88,17 @@ public interface ChatCommandsConfig extends Config
|
||||
|
||||
@ConfigItem(
|
||||
position = 5,
|
||||
keyName = "pb",
|
||||
name = "PB Command",
|
||||
description = "Configures whether the personal best command is enabled<br> !pb"
|
||||
)
|
||||
default boolean pb()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@ConfigItem(
|
||||
position = 6,
|
||||
keyName = "clearShortcuts",
|
||||
name = "Clear shortcuts",
|
||||
description = "Enable shortcuts (ctrl+w and backspace) for clearing the chatbox"
|
||||
|
||||
@@ -71,6 +71,7 @@ import net.runelite.http.api.hiscore.HiscoreSkill;
|
||||
import net.runelite.http.api.hiscore.SingleHiscoreSkillResult;
|
||||
import net.runelite.http.api.hiscore.Skill;
|
||||
import net.runelite.http.api.item.ItemPrice;
|
||||
import org.apache.commons.text.WordUtils;
|
||||
|
||||
@PluginDescriptor(
|
||||
name = "Chat Commands",
|
||||
@@ -85,6 +86,8 @@ public class ChatCommandsPlugin extends Plugin
|
||||
private static final Pattern RAIDS_PATTERN = Pattern.compile("Your completed (.+) count is: <col=ff0000>(\\d+)</col>.");
|
||||
private static final Pattern WINTERTODT_PATTERN = Pattern.compile("Your subdued Wintertodt count is: <col=ff0000>(\\d+)</col>.");
|
||||
private static final Pattern BARROWS_PATTERN = Pattern.compile("Your Barrows chest count is: <col=ff0000>(\\d+)</col>.");
|
||||
private static final Pattern KILL_DURATION_PATTERN = Pattern.compile("Fight duration: <col=ff0000>[0-9:]+</col>. Personal best: ([0-9:]+).");
|
||||
private static final Pattern NEW_PB_PATTERN = Pattern.compile("Fight duration: <col=ff0000>([0-9:]+)</col> \\(new personal best\\).");
|
||||
private static final String TOTAL_LEVEL_COMMAND_STRING = "!total";
|
||||
private static final String PRICE_COMMAND_STRING = "!price";
|
||||
private static final String LEVEL_COMMAND_STRING = "!lvl";
|
||||
@@ -92,12 +95,14 @@ public class ChatCommandsPlugin extends Plugin
|
||||
private static final String KILLCOUNT_COMMAND_STRING = "!kc";
|
||||
private static final String CMB_COMMAND_STRING = "!cmb";
|
||||
private static final String QP_COMMAND_STRING = "!qp";
|
||||
private static final String PB_COMMAND = "!pb";
|
||||
|
||||
private final HiscoreClient hiscoreClient = new HiscoreClient();
|
||||
private final ChatClient chatClient = new ChatClient();
|
||||
|
||||
private boolean logKills;
|
||||
private HiscoreEndpoint hiscoreEndpoint; // hiscore endpoint for current player
|
||||
private String lastBossKill;
|
||||
|
||||
@Inject
|
||||
private Client client;
|
||||
@@ -138,11 +143,14 @@ public class ChatCommandsPlugin extends Plugin
|
||||
chatCommandManager.registerCommandAsync(CLUES_COMMAND_STRING, this::clueLookup);
|
||||
chatCommandManager.registerCommandAsync(KILLCOUNT_COMMAND_STRING, this::killCountLookup, this::killCountSubmit);
|
||||
chatCommandManager.registerCommandAsync(QP_COMMAND_STRING, this::questPointsLookup, this::questPointsSubmit);
|
||||
chatCommandManager.registerCommandAsync(PB_COMMAND, this::personalBestLookup, this::personalBestSubmit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutDown()
|
||||
{
|
||||
lastBossKill = null;
|
||||
|
||||
keyManager.unregisterKeyListener(chatKeyboardListener);
|
||||
|
||||
chatCommandManager.unregisterCommand(TOTAL_LEVEL_COMMAND_STRING);
|
||||
@@ -152,6 +160,7 @@ public class ChatCommandsPlugin extends Plugin
|
||||
chatCommandManager.unregisterCommand(CLUES_COMMAND_STRING);
|
||||
chatCommandManager.unregisterCommand(KILLCOUNT_COMMAND_STRING);
|
||||
chatCommandManager.unregisterCommand(QP_COMMAND_STRING);
|
||||
chatCommandManager.unregisterCommand(PB_COMMAND);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@@ -173,6 +182,19 @@ public class ChatCommandsPlugin extends Plugin
|
||||
return killCount == null ? 0 : killCount;
|
||||
}
|
||||
|
||||
private void setPb(String boss, int seconds)
|
||||
{
|
||||
configManager.setConfiguration("personalbest." + client.getUsername().toLowerCase(),
|
||||
boss.toLowerCase(), seconds);
|
||||
}
|
||||
|
||||
private int getPb(String boss)
|
||||
{
|
||||
Integer personalBest = configManager.getConfiguration("personalbest." + client.getUsername().toLowerCase(),
|
||||
boss.toLowerCase(), int.class);
|
||||
return personalBest == null ? 0 : personalBest;
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onChatMessage(ChatMessage chatMessage)
|
||||
{
|
||||
@@ -189,6 +211,8 @@ public class ChatCommandsPlugin extends Plugin
|
||||
int kc = Integer.parseInt(matcher.group(2));
|
||||
|
||||
setKc(boss, kc);
|
||||
lastBossKill = boss;
|
||||
return;
|
||||
}
|
||||
|
||||
matcher = WINTERTODT_PATTERN.matcher(message);
|
||||
@@ -206,6 +230,8 @@ public class ChatCommandsPlugin extends Plugin
|
||||
int kc = Integer.parseInt(matcher.group(2));
|
||||
|
||||
setKc(boss, kc);
|
||||
lastBossKill = boss;
|
||||
return;
|
||||
}
|
||||
|
||||
matcher = BARROWS_PATTERN.matcher(message);
|
||||
@@ -215,6 +241,35 @@ public class ChatCommandsPlugin extends Plugin
|
||||
|
||||
setKc("Barrows Chests", kc);
|
||||
}
|
||||
|
||||
if (lastBossKill != null)
|
||||
{
|
||||
matcher = KILL_DURATION_PATTERN.matcher(message);
|
||||
if (matcher.find())
|
||||
{
|
||||
matchPb(matcher);
|
||||
}
|
||||
|
||||
matcher = NEW_PB_PATTERN.matcher(message);
|
||||
if (matcher.find())
|
||||
{
|
||||
matchPb(matcher);
|
||||
}
|
||||
}
|
||||
|
||||
lastBossKill = null;
|
||||
}
|
||||
|
||||
private void matchPb(Matcher matcher)
|
||||
{
|
||||
String personalBest = matcher.group(1);
|
||||
String[] s = personalBest.split(":");
|
||||
if (s.length == 2)
|
||||
{
|
||||
int seconds = Integer.parseInt(s[0]) * 60 + Integer.parseInt(s[1]);
|
||||
log.debug("Got personal best for {}: {}", lastBossKill, seconds);
|
||||
setPb(lastBossKill, seconds);
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@@ -411,7 +466,91 @@ public class ChatCommandsPlugin extends Plugin
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.warn("unable to submit quest poinits", ex);
|
||||
log.warn("unable to submit quest points", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
chatInput.resume();
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void personalBestLookup(SetMessage setMessage, String message)
|
||||
{
|
||||
if (!config.pb())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ChatMessageType type = setMessage.getType();
|
||||
String search = message.substring(PB_COMMAND.length() + 1);
|
||||
|
||||
final String player;
|
||||
if (type.equals(ChatMessageType.PRIVATE_MESSAGE_SENT))
|
||||
{
|
||||
player = client.getLocalPlayer().getName();
|
||||
}
|
||||
else
|
||||
{
|
||||
player = sanitize(setMessage.getName());
|
||||
}
|
||||
|
||||
search = longBossName(search);
|
||||
|
||||
final int pb;
|
||||
try
|
||||
{
|
||||
pb = chatClient.getPb(player, search);
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
log.debug("unable to lookup personal best", ex);
|
||||
return;
|
||||
}
|
||||
|
||||
int minutes = pb / 60;
|
||||
int seconds = pb % 60;
|
||||
|
||||
String response = new ChatMessageBuilder()
|
||||
.append(ChatColorType.HIGHLIGHT)
|
||||
.append(search)
|
||||
.append(ChatColorType.NORMAL)
|
||||
.append(" personal best: ")
|
||||
.append(ChatColorType.HIGHLIGHT)
|
||||
.append(String.format("%d:%02d", minutes, seconds))
|
||||
.build();
|
||||
|
||||
log.debug("Setting response {}", response);
|
||||
final MessageNode messageNode = setMessage.getMessageNode();
|
||||
messageNode.setRuneLiteFormatMessage(response);
|
||||
chatMessageManager.update(messageNode);
|
||||
client.refreshChat();
|
||||
}
|
||||
|
||||
private boolean personalBestSubmit(ChatInput chatInput, String value)
|
||||
{
|
||||
int idx = value.indexOf(' ');
|
||||
final String boss = longBossName(value.substring(idx + 1));
|
||||
|
||||
final int pb = getPb(boss);
|
||||
if (pb <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final String playerName = client.getLocalPlayer().getName();
|
||||
|
||||
executor.execute(() ->
|
||||
{
|
||||
try
|
||||
{
|
||||
chatClient.submitPb(playerName, boss, pb);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.warn("unable to submit personal best", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -965,7 +1104,7 @@ public class ChatCommandsPlugin extends Plugin
|
||||
return "Theatre of Blood";
|
||||
|
||||
default:
|
||||
return boss;
|
||||
return WordUtils.capitalize(boss);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import net.runelite.client.config.ConfigManager;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import org.mockito.Mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -128,4 +129,38 @@ public class ChatCommandsPluginTest
|
||||
|
||||
verify(configManager).setConfiguration("killcount.adam", "barrows chests", 277);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPersonalBest()
|
||||
{
|
||||
final String FIGHT_DURATION = "Fight duration: <col=ff0000>2:06</col>. Personal best: 1:19.";
|
||||
|
||||
when(client.getUsername()).thenReturn("Adam");
|
||||
|
||||
// This sets lastBoss
|
||||
ChatMessage chatMessage = new ChatMessage(SERVER, "", "Your Kree'arra kill count is: <col=ff0000>4</col>.", null);
|
||||
chatCommandsPlugin.onChatMessage(chatMessage);
|
||||
|
||||
chatMessage = new ChatMessage(SERVER, "", FIGHT_DURATION, null);
|
||||
chatCommandsPlugin.onChatMessage(chatMessage);
|
||||
|
||||
verify(configManager).setConfiguration(eq("personalbest.adam"), eq("kree'arra"), eq(79));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNewPersonalBest()
|
||||
{
|
||||
final String NEW_PB = "Fight duration: <col=ff0000>3:01</col> (new personal best).";
|
||||
|
||||
when(client.getUsername()).thenReturn("Adam");
|
||||
|
||||
// This sets lastBoss
|
||||
ChatMessage chatMessage = new ChatMessage(SERVER, "", "Your Kree'arra kill count is: <col=ff0000>4</col>.", null);
|
||||
chatCommandsPlugin.onChatMessage(chatMessage);
|
||||
|
||||
chatMessage = new ChatMessage(SERVER, "", NEW_PB, null);
|
||||
chatCommandsPlugin.onChatMessage(chatMessage);
|
||||
|
||||
verify(configManager).setConfiguration(eq("personalbest.adam"), eq("kree'arra"), eq(181));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user