From d6a8dbdb52184e980aa3f94a08d5eb4863d466bc Mon Sep 17 00:00:00 2001 From: SoyChai Date: Sun, 8 Apr 2018 11:51:28 +1000 Subject: [PATCH] screenshot: Fix ArrayIndexOutOfBounds errors caused by unsafe parsing of level-up widget --- .../plugins/screenshot/ScreenshotPlugin.java | 26 +++++++++---------- .../screenshot/ScreenshotPluginTest.java | 26 +++---------------- 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index f723f092b5..f66e29fc4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -102,6 +102,7 @@ public class ScreenshotPlugin extends Plugin private static final DateFormat TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US); private static final Pattern NUMBER_PATTERN = Pattern.compile("([0-9]+)"); + private static final Pattern LEVEL_UP_PATTERN = Pattern.compile("Your ([a-zA-Z]+) (?:level is|are)? now (\\d+)\\."); private String clueType; private Integer clueNumber; @@ -264,12 +265,12 @@ public class ScreenshotPlugin extends Plugin { case LEVEL_UP_GROUP_ID: { - fileName = parseLevelUpWidget(WidgetInfo.LEVEL_UP_SKILL, WidgetInfo.LEVEL_UP_LEVEL); + fileName = parseLevelUpWidget(WidgetInfo.LEVEL_UP_LEVEL); break; } case DIALOG_SPRITE_GROUP_ID: { - fileName = parseLevelUpWidget(WidgetInfo.DIALOG_SPRITE_SPRITE, WidgetInfo.DIALOG_SPRITE_TEXT); + fileName = parseLevelUpWidget(WidgetInfo.DIALOG_SPRITE_TEXT); break; } case QUEST_COMPLETED_GROUP_ID: @@ -333,25 +334,22 @@ public class ScreenshotPlugin extends Plugin takeScreenshot(fileName, config.displayDate()); } - public String parseLevelUpWidget(WidgetInfo levelUpSkill, WidgetInfo levelUpLevel) + public String parseLevelUpWidget(WidgetInfo levelUpLevel) { - Widget skillChild = client.getWidget(levelUpSkill); Widget levelChild = client.getWidget(levelUpLevel); - - if (skillChild == null || levelChild == null) + if (levelChild == null) { return null; } - // "Congratulations, you just advanced a Firemaking level." - String skillText = skillChild.getText(); - // "Your Firemaking level is now 9." - String levelText = levelChild.getText(); - - String[] splitSkillName = skillText.split(" "); - String skillName = splitSkillName[splitSkillName.length - 2]; - String skillLevel = levelText.substring(levelText.lastIndexOf(" ") + 1, levelText.length() - 1); + Matcher m = LEVEL_UP_PATTERN.matcher(levelChild.getText()); + if (!m.matches()) + { + return null; + } + String skillName = m.group(1); + String skillLevel = m.group(2); return skillName + "(" + skillLevel + ")"; } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java index 497e604e2d..ef4363a77d 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/screenshot/ScreenshotPluginTest.java @@ -37,10 +37,8 @@ import net.runelite.api.events.WidgetHiddenChanged; import net.runelite.api.widgets.Widget; import static net.runelite.api.widgets.WidgetID.DIALOG_SPRITE_GROUP_ID; import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; -import static net.runelite.api.widgets.WidgetInfo.DIALOG_SPRITE_SPRITE; import static net.runelite.api.widgets.WidgetInfo.DIALOG_SPRITE_TEXT; import static net.runelite.api.widgets.WidgetInfo.LEVEL_UP_LEVEL; -import static net.runelite.api.widgets.WidgetInfo.LEVEL_UP_SKILL; import static net.runelite.api.widgets.WidgetInfo.PACK; import net.runelite.client.Notifier; import net.runelite.client.config.RuneLiteConfig; @@ -137,16 +135,12 @@ public class ScreenshotPluginTest Widget widget = mock(Widget.class); when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); - Widget skillChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(LEVEL_UP_SKILL))).thenReturn(skillChild); - Widget levelChild = mock(Widget.class); when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); - when(skillChild.getText()).thenReturn("Congratulations, you just advanced a Hitpoints level."); when(levelChild.getText()).thenReturn("Your Hitpoints are now 99."); - assertEquals("Hitpoints(99)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_SKILL, LEVEL_UP_LEVEL)); + assertEquals("Hitpoints(99)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); WidgetHiddenChanged event = new WidgetHiddenChanged(); event.setWidget(widget); @@ -161,16 +155,12 @@ public class ScreenshotPluginTest Widget widget = mock(Widget.class); when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); - Widget skillChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(LEVEL_UP_SKILL))).thenReturn(skillChild); - Widget levelChild = mock(Widget.class); when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); - when(skillChild.getText()).thenReturn("Congratulations, you just advanced a Firemaking level."); when(levelChild.getText()).thenReturn("Your Firemaking level is now 9."); - assertEquals("Firemaking(9)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_SKILL, LEVEL_UP_LEVEL)); + assertEquals("Firemaking(9)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); WidgetHiddenChanged event = new WidgetHiddenChanged(); event.setWidget(widget); @@ -185,16 +175,12 @@ public class ScreenshotPluginTest Widget widget = mock(Widget.class); when(widget.getId()).thenReturn(PACK(LEVEL_UP_GROUP_ID, 0)); - Widget skillChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(LEVEL_UP_SKILL))).thenReturn(skillChild); - Widget levelChild = mock(Widget.class); when(client.getWidget(Matchers.eq(LEVEL_UP_LEVEL))).thenReturn(levelChild); - when(skillChild.getText()).thenReturn("Congratulations, you just advanced an Attack level."); when(levelChild.getText()).thenReturn("Your Attack level is now 70."); - assertEquals("Attack(70)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_SKILL, LEVEL_UP_LEVEL)); + assertEquals("Attack(70)", screenshotPlugin.parseLevelUpWidget(LEVEL_UP_LEVEL)); WidgetHiddenChanged event = new WidgetHiddenChanged(); event.setWidget(widget); @@ -209,16 +195,12 @@ public class ScreenshotPluginTest Widget widget = mock(Widget.class); when(widget.getId()).thenReturn(PACK(DIALOG_SPRITE_GROUP_ID, 0)); - Widget skillChild = mock(Widget.class); - when(client.getWidget(Matchers.eq(DIALOG_SPRITE_SPRITE))).thenReturn(skillChild); - Widget levelChild = mock(Widget.class); when(client.getWidget(Matchers.eq(DIALOG_SPRITE_TEXT))).thenReturn(levelChild); - when(skillChild.getText()).thenReturn("Congratulations, you just advanced a Hunter level."); when(levelChild.getText()).thenReturn("Your Hunter level is now 2."); - assertEquals("Hunter(2)", screenshotPlugin.parseLevelUpWidget(DIALOG_SPRITE_SPRITE, DIALOG_SPRITE_TEXT)); + assertEquals("Hunter(2)", screenshotPlugin.parseLevelUpWidget(DIALOG_SPRITE_TEXT)); WidgetHiddenChanged event = new WidgetHiddenChanged(); event.setWidget(widget);