Skip to content

Commit 6a8673a

Browse files
authored
refactor: hard code achievement diary enum (#80)
Hardcoding to better comply with plugin hub restrictions
1 parent 67731ab commit 6a8673a

9 files changed

+116
-138
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- Minor: Use notifier-specific screenshot filenames. (#79)
44
- Minor: Support notifier-specific webhook URLs. (#78)
5+
- Dev: Explicitly define achievement diaries. (#80)
56
- Dev: Add mockito test suite for notifiers. (#74, #75)
67
- Dev: Utilize more dependency injection. (#73)
78

src/main/java/dinkplugin/DinkPluginConfig.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dinkplugin;
22

3-
import dinkplugin.domain.AchievementDiaries;
3+
import dinkplugin.domain.AchievementDiary;
44
import dinkplugin.domain.CombatAchievementTier;
55
import net.runelite.client.config.Config;
66
import net.runelite.client.config.ConfigGroup;
@@ -781,8 +781,8 @@ default boolean diarySendImage() {
781781
position = 112,
782782
section = diarySection
783783
)
784-
default AchievementDiaries.Difficulty minDiaryDifficulty() {
785-
return AchievementDiaries.Difficulty.EASY;
784+
default AchievementDiary.Difficulty minDiaryDifficulty() {
785+
return AchievementDiary.Difficulty.EASY;
786786
}
787787

788788
@ConfigItem(

src/main/java/dinkplugin/domain/AchievementDiaries.java

-84
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package dinkplugin.domain;
2+
3+
import lombok.Getter;
4+
import lombok.RequiredArgsConstructor;
5+
import net.runelite.api.Varbits;
6+
import net.runelite.api.annotations.Varbit;
7+
import org.apache.commons.lang3.tuple.Pair;
8+
9+
import java.util.Arrays;
10+
import java.util.Collections;
11+
import java.util.Map;
12+
import java.util.stream.Collectors;
13+
14+
@Getter
15+
@RequiredArgsConstructor
16+
public enum AchievementDiary {
17+
ARDOUGNE_EASY(Varbits.DIARY_ARDOUGNE_EASY, "Ardougne", Difficulty.EASY),
18+
ARDOUGNE_MEDIUM(Varbits.DIARY_ARDOUGNE_MEDIUM, "Ardougne", Difficulty.MEDIUM),
19+
ARDOUGNE_HARD(Varbits.DIARY_ARDOUGNE_HARD, "Ardougne", Difficulty.HARD),
20+
ARDOUGNE_ELITE(Varbits.DIARY_ARDOUGNE_ELITE, "Ardougne", Difficulty.ELITE),
21+
DESERT_EASY(Varbits.DIARY_DESERT_EASY, "Desert", Difficulty.EASY),
22+
DESERT_MEDIUM(Varbits.DIARY_DESERT_MEDIUM, "Desert", Difficulty.MEDIUM),
23+
DESERT_HARD(Varbits.DIARY_DESERT_HARD, "Desert", Difficulty.HARD),
24+
DESERT_ELITE(Varbits.DIARY_DESERT_ELITE, "Desert", Difficulty.ELITE),
25+
FALADOR_EASY(Varbits.DIARY_FALADOR_EASY, "Falador", Difficulty.EASY),
26+
FALADOR_MEDIUM(Varbits.DIARY_FALADOR_MEDIUM, "Falador", Difficulty.MEDIUM),
27+
FALADOR_HARD(Varbits.DIARY_FALADOR_HARD, "Falador", Difficulty.HARD),
28+
FALADOR_ELITE(Varbits.DIARY_FALADOR_ELITE, "Falador", Difficulty.ELITE),
29+
FREMENNIK_EASY(Varbits.DIARY_FREMENNIK_EASY, "Fremennik", Difficulty.EASY),
30+
FREMENNIK_MEDIUM(Varbits.DIARY_FREMENNIK_MEDIUM, "Fremennik", Difficulty.MEDIUM),
31+
FREMENNIK_HARD(Varbits.DIARY_FREMENNIK_HARD, "Fremennik", Difficulty.HARD),
32+
FREMENNIK_ELITE(Varbits.DIARY_FREMENNIK_ELITE, "Fremennik", Difficulty.ELITE),
33+
KANDARIN_EASY(Varbits.DIARY_KANDARIN_EASY, "Kandarin", Difficulty.EASY),
34+
KANDARIN_MEDIUM(Varbits.DIARY_KANDARIN_MEDIUM, "Kandarin", Difficulty.MEDIUM),
35+
KANDARIN_HARD(Varbits.DIARY_KANDARIN_HARD, "Kandarin", Difficulty.HARD),
36+
KANDARIN_ELITE(Varbits.DIARY_KANDARIN_ELITE, "Kandarin", Difficulty.ELITE),
37+
KARAMJA_EASY(Varbits.DIARY_KARAMJA_EASY, "Karamja", Difficulty.EASY),
38+
KARAMJA_MEDIUM(Varbits.DIARY_KARAMJA_MEDIUM, "Karamja", Difficulty.MEDIUM),
39+
KARAMJA_HARD(Varbits.DIARY_KARAMJA_HARD, "Karamja", Difficulty.HARD),
40+
KARAMJA_ELITE(Varbits.DIARY_KARAMJA_ELITE, "Karamja", Difficulty.ELITE),
41+
KOUREND_EASY(Varbits.DIARY_KOUREND_EASY, "Kourend & Kebos", Difficulty.EASY),
42+
KOUREND_MEDIUM(Varbits.DIARY_KOUREND_MEDIUM, "Kourend & Kebos", Difficulty.MEDIUM),
43+
KOUREND_HARD(Varbits.DIARY_KOUREND_HARD, "Kourend & Kebos", Difficulty.HARD),
44+
KOUREND_ELITE(Varbits.DIARY_KOUREND_ELITE, "Kourend & Kebos", Difficulty.ELITE),
45+
LUMBRIDGE_EASY(Varbits.DIARY_LUMBRIDGE_EASY, "Lumbridge & Draynor", Difficulty.EASY),
46+
LUMBRIDGE_MEDIUM(Varbits.DIARY_LUMBRIDGE_MEDIUM, "Lumbridge & Draynor", Difficulty.MEDIUM),
47+
LUMBRIDGE_HARD(Varbits.DIARY_LUMBRIDGE_HARD, "Lumbridge & Draynor", Difficulty.HARD),
48+
LUMBRIDGE_ELITE(Varbits.DIARY_LUMBRIDGE_ELITE, "Lumbridge & Draynor", Difficulty.ELITE),
49+
MORYTANIA_EASY(Varbits.DIARY_MORYTANIA_EASY, "Morytania", Difficulty.EASY),
50+
MORYTANIA_MEDIUM(Varbits.DIARY_MORYTANIA_MEDIUM, "Morytania", Difficulty.MEDIUM),
51+
MORYTANIA_HARD(Varbits.DIARY_MORYTANIA_HARD, "Morytania", Difficulty.HARD),
52+
MORYTANIA_ELITE(Varbits.DIARY_MORYTANIA_ELITE, "Morytania", Difficulty.ELITE),
53+
VARROCK_EASY(Varbits.DIARY_VARROCK_EASY, "Varrock", Difficulty.EASY),
54+
VARROCK_MEDIUM(Varbits.DIARY_VARROCK_MEDIUM, "Varrock", Difficulty.MEDIUM),
55+
VARROCK_HARD(Varbits.DIARY_VARROCK_HARD, "Varrock", Difficulty.HARD),
56+
VARROCK_ELITE(Varbits.DIARY_VARROCK_ELITE, "Varrock", Difficulty.ELITE),
57+
WESTERN_EASY(Varbits.DIARY_WESTERN_EASY, "Western Provinces", Difficulty.EASY),
58+
WESTERN_MEDIUM(Varbits.DIARY_WESTERN_MEDIUM, "Western Provinces", Difficulty.MEDIUM),
59+
WESTERN_HARD(Varbits.DIARY_WESTERN_HARD, "Western Provinces", Difficulty.HARD),
60+
WESTERN_ELITE(Varbits.DIARY_WESTERN_ELITE, "Western Provinces", Difficulty.ELITE),
61+
WILDERNESS_EASY(Varbits.DIARY_WILDERNESS_EASY, "Wilderness", Difficulty.EASY),
62+
WILDERNESS_MEDIUM(Varbits.DIARY_WILDERNESS_MEDIUM, "Wilderness", Difficulty.MEDIUM),
63+
WILDERNESS_HARD(Varbits.DIARY_WILDERNESS_HARD, "Wilderness", Difficulty.HARD),
64+
WILDERNESS_ELITE(Varbits.DIARY_WILDERNESS_ELITE, "Wilderness", Difficulty.ELITE);
65+
66+
public static final Map<Integer, Pair<String, Difficulty>> DIARIES = Collections.unmodifiableMap(
67+
Arrays.stream(values())
68+
.collect(Collectors.toMap(AchievementDiary::getId, diary -> Pair.of(diary.getArea(), diary.getDifficulty())))
69+
);
70+
71+
@Varbit
72+
private final int id;
73+
private final String area;
74+
private final Difficulty difficulty;
75+
76+
public enum Difficulty {
77+
EASY,
78+
MEDIUM,
79+
HARD,
80+
ELITE;
81+
82+
private final String displayName = this.name().charAt(0) + this.name().substring(1).toLowerCase();
83+
84+
@Override
85+
public String toString() {
86+
return this.displayName;
87+
}
88+
}
89+
}

src/main/java/dinkplugin/notifiers/DiaryNotifier.java

+12-10
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,24 @@
22

33
import dinkplugin.DinkPluginConfig;
44
import dinkplugin.Utils;
5-
import dinkplugin.domain.AchievementDiaries;
5+
import dinkplugin.domain.AchievementDiary;
66
import dinkplugin.message.NotificationBody;
77
import dinkplugin.message.NotificationType;
88
import dinkplugin.notifiers.data.DiaryNotificationData;
99
import net.runelite.api.GameState;
1010
import net.runelite.api.events.GameStateChanged;
1111
import net.runelite.api.events.VarbitChanged;
1212
import org.apache.commons.lang3.StringUtils;
13+
import org.apache.commons.lang3.tuple.Pair;
1314

1415
import javax.inject.Singleton;
1516
import java.util.HashMap;
1617
import java.util.Map;
1718

19+
import static dinkplugin.domain.AchievementDiary.DIARIES;
20+
1821
@Singleton
1922
public class DiaryNotifier extends BaseNotifier {
20-
private static final Map<Integer, AchievementDiaries.Diary> DIARIES = AchievementDiaries.INSTANCE.getDiaries();
2123
private final Map<Integer, Integer> diaryCompletionById = new HashMap<>();
2224
private int initDelayTicks = 0;
2325

@@ -59,7 +61,7 @@ public void onTick() {
5961
public void onVarbitChanged(VarbitChanged event) {
6062
int id = event.getVarbitId();
6163
if (id < 0) return;
62-
AchievementDiaries.Diary diary = DIARIES.get(id);
64+
Pair<String, AchievementDiary.Difficulty> diary = DIARIES.get(id);
6365
if (diary == null) return;
6466
if (diaryCompletionById.isEmpty()) return;
6567
if (!super.isEnabled()) return;
@@ -76,31 +78,31 @@ public void onVarbitChanged(VarbitChanged event) {
7678
return;
7779
}
7880

79-
if (checkDifficulty(diary))
80-
handle(diary);
81+
if (checkDifficulty(diary.getRight()))
82+
handle(diary.getLeft(), diary.getRight());
8183
}
8284
}
8385

84-
private void handle(AchievementDiaries.Diary diary) {
86+
private void handle(String area, AchievementDiary.Difficulty difficulty) {
8587
int total = getTotalCompleted();
8688
String player = Utils.getPlayerName(client);
8789
String message = StringUtils.replaceEach(
8890
config.diaryNotifyMessage(),
8991
new String[] { "%USERNAME%", "%DIFFICULTY%", "%AREA%", "%TOTAL%" },
90-
new String[] { player, diary.getDifficulty().toString(), diary.getArea(), String.valueOf(total) }
92+
new String[] { player, difficulty.toString(), area, String.valueOf(total) }
9193
);
9294

9395
createMessage(DinkPluginConfig::diarySendImage, NotificationBody.builder()
9496
.type(NotificationType.ACHIEVEMENT_DIARY)
9597
.content(message)
96-
.extra(new DiaryNotificationData(diary.getArea(), diary.getDifficulty(), total))
98+
.extra(new DiaryNotificationData(area, difficulty, total))
9799
.playerName(player)
98100
.screenshotFile("achievementDiaryImage.png")
99101
.build());
100102
}
101103

102-
private boolean checkDifficulty(AchievementDiaries.Diary diary) {
103-
return config.notifyAchievementDiary() && diary.getDifficulty().ordinal() >= config.minDiaryDifficulty().ordinal();
104+
private boolean checkDifficulty(AchievementDiary.Difficulty difficulty) {
105+
return config.notifyAchievementDiary() && difficulty.ordinal() >= config.minDiaryDifficulty().ordinal();
104106
}
105107

106108
private int getTotalCompleted() {
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package dinkplugin.notifiers.data;
22

3-
import dinkplugin.domain.AchievementDiaries;
3+
import dinkplugin.domain.AchievementDiary;
44
import lombok.Value;
55

66
@Value
77
public class DiaryNotificationData {
88
String area;
9-
AchievementDiaries.Difficulty difficulty;
9+
AchievementDiary.Difficulty difficulty;
1010
int total;
1111
}

src/test/java/dinkplugin/domain/AchievementDiariesTest.java

-30
This file was deleted.

src/test/java/dinkplugin/notifiers/CombatTaskNotifierTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dinkplugin.notifiers;
22

3-
import dinkplugin.domain.AchievementDiaries;
3+
import dinkplugin.domain.AchievementDiary;
44
import dinkplugin.domain.CombatAchievementTier;
55
import dinkplugin.message.NotificationBody;
66
import dinkplugin.message.NotificationType;
@@ -42,7 +42,7 @@ void testNotify() {
4242
PRIMARY_WEBHOOK_URL,
4343
false,
4444
NotificationBody.builder()
45-
.content(String.format("%s has completed %s combat task: %s", PLAYER_NAME, AchievementDiaries.Difficulty.HARD, "Whack-a-Mole"))
45+
.content(String.format("%s has completed %s combat task: %s", PLAYER_NAME, "Hard", "Whack-a-Mole"))
4646
.extra(new CombatAchievementData(CombatAchievementTier.HARD, "Whack-a-Mole"))
4747
.playerName(PLAYER_NAME)
4848
.type(NotificationType.COMBAT_ACHIEVEMENT)

src/test/java/dinkplugin/notifiers/DiaryNotifierTest.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dinkplugin.notifiers;
22

3-
import dinkplugin.domain.AchievementDiaries;
3+
import dinkplugin.domain.AchievementDiary;
44
import dinkplugin.message.NotificationBody;
55
import dinkplugin.message.NotificationType;
66
import dinkplugin.notifiers.data.DiaryNotificationData;
@@ -34,7 +34,7 @@ protected void setUp() {
3434
// init config mocks
3535
when(config.notifyAchievementDiary()).thenReturn(true);
3636
when(config.diarySendImage()).thenReturn(false);
37-
when(config.minDiaryDifficulty()).thenReturn(AchievementDiaries.Difficulty.MEDIUM);
37+
when(config.minDiaryDifficulty()).thenReturn(AchievementDiary.Difficulty.MEDIUM);
3838
when(config.diaryNotifyMessage()).thenReturn("%USERNAME% has completed the %DIFFICULTY% %AREA% Diary, for a total of %TOTAL%");
3939

4040
// init client mocks
@@ -58,8 +58,8 @@ void testNotifyFirst() {
5858
PRIMARY_WEBHOOK_URL,
5959
false,
6060
NotificationBody.builder()
61-
.content(String.format("%s has completed the %s %s Diary, for a total of %d", PLAYER_NAME, AchievementDiaries.Difficulty.ELITE, "Desert", 1))
62-
.extra(new DiaryNotificationData("Desert", AchievementDiaries.Difficulty.ELITE, 1))
61+
.content(String.format("%s has completed the %s %s Diary, for a total of %d", PLAYER_NAME, AchievementDiary.Difficulty.ELITE, "Desert", 1))
62+
.extra(new DiaryNotificationData("Desert", AchievementDiary.Difficulty.ELITE, 1))
6363
.type(NotificationType.ACHIEVEMENT_DIARY)
6464
.playerName(PLAYER_NAME)
6565
.build()
@@ -70,7 +70,7 @@ void testNotifyFirst() {
7070
void testNotifyKaramja() {
7171
// initially many diary completions
7272
when(client.getVarbitValue(anyInt())).thenReturn(1);
73-
int total = AchievementDiaries.INSTANCE.getDiaries().size() - 3;
73+
int total = AchievementDiary.DIARIES.size() - 3;
7474

7575
// perform enough ticks to trigger diary initialization
7676
IntStream.range(0, 16).forEach(i -> notifier.onTick());
@@ -84,8 +84,8 @@ void testNotifyKaramja() {
8484
PRIMARY_WEBHOOK_URL,
8585
false,
8686
NotificationBody.builder()
87-
.content(String.format("%s has completed the %s %s Diary, for a total of %d", PLAYER_NAME, AchievementDiaries.Difficulty.HARD, "Karamja", total + 1))
88-
.extra(new DiaryNotificationData("Karamja", AchievementDiaries.Difficulty.HARD, total + 1))
87+
.content(String.format("%s has completed the %s %s Diary, for a total of %d", PLAYER_NAME, AchievementDiary.Difficulty.HARD, "Karamja", total + 1))
88+
.extra(new DiaryNotificationData("Karamja", AchievementDiary.Difficulty.HARD, total + 1))
8989
.type(NotificationType.ACHIEVEMENT_DIARY)
9090
.playerName(PLAYER_NAME)
9191
.build()

0 commit comments

Comments
 (0)