Skip to content

Commit 58a4773

Browse files
committed
Include join code in /aoc output
1 parent 4a17c88 commit 58a4773

File tree

4 files changed

+57
-30
lines changed

4 files changed

+57
-30
lines changed

bot-context.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,15 @@
179179
-->
180180
<constructor-arg value="session token goes here" />
181181
</bean>
182+
<bean class="oakbot.command.aoc.AdventOfCodeLeaderboard" id="aocLeaderboard">
183+
<constructor-arg value="123456" /> <!-- leaderboard ID -->
184+
<constructor-arg value="abc-123" /> <!-- join code (leave out this argument if you want to keep it private) -->
185+
</bean>
182186
<bean class="oakbot.command.aoc.AdventOfCode">
183187
<constructor-arg value="PT15M" /> <!-- polling interval. AoC asks that this not be less than 15 minutes. -->
184188
<constructor-arg>
185189
<util:map> <!-- the leaderboard to show for each room if the user does not specify a leaderboard ID (can be empty) -->
186-
<entry key="1" value="123456" />
190+
<entry key="1" value-ref="aocLeaderboard" />
187191
</util:map>
188192
</constructor-arg>
189193
<constructor-arg ref="aocApi" />

src/main/java/oakbot/command/aoc/AdventOfCode.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class AdventOfCode implements ScheduledTask, Command {
3838

3939
private final Duration pollingInterval;
4040
private final AdventOfCodeApi api;
41-
private final Map<Integer, String> monitoredLeaderboardByRoom;
41+
private final Map<Integer, AdventOfCodeLeaderboard> monitoredLeaderboardByRoom;
4242
private final Map<Integer, Instant> lastChecked = new HashMap<>();
4343

4444
/**
@@ -51,7 +51,7 @@ public class AdventOfCode implements ScheduledTask, Command {
5151
* leaderboard ID. Can be empty.
5252
* @param api for retrieving data from AoC
5353
*/
54-
public AdventOfCode(String pollingInterval, Map<Integer, String> monitoredLeaderboardByRoom, AdventOfCodeApi api) {
54+
public AdventOfCode(String pollingInterval, Map<Integer, AdventOfCodeLeaderboard> monitoredLeaderboardByRoom, AdventOfCodeApi api) {
5555
this.pollingInterval = Duration.parse(pollingInterval);
5656
this.monitoredLeaderboardByRoom = monitoredLeaderboardByRoom;
5757
this.api = api;
@@ -92,14 +92,19 @@ public ChatActions onMessage(ChatCommand chatCommand, IBot bot) {
9292
var displayDefaultLeaderboard = content.isEmpty();
9393

9494
String leaderboardId;
95+
String joinCode;
9596
if (displayDefaultLeaderboard) {
9697
var roomId = chatCommand.getMessage().getRoomId();
97-
leaderboardId = monitoredLeaderboardByRoom.get(roomId);
98-
if (leaderboardId == null) {
98+
var leaderboard = monitoredLeaderboardByRoom.get(roomId);
99+
if (leaderboard == null) {
99100
return reply("Please specify a leaderboard ID (e.g. " + bot.getTrigger() + name() + " 123456).", chatCommand);
100101
}
102+
103+
leaderboardId = leaderboard.id();
104+
joinCode = leaderboard.joinCode();
101105
} else {
102106
leaderboardId = content;
107+
joinCode = null;
103108
}
104109

105110
List<Player> players;
@@ -111,7 +116,7 @@ public ChatActions onMessage(ChatCommand chatCommand, IBot bot) {
111116
}
112117

113118
var websiteUrl = api.getLeaderboardWebsite(leaderboardId);
114-
var leaderboardStr = buildLeaderboard(players, websiteUrl);
119+
var leaderboardStr = buildLeaderboard(players, websiteUrl, joinCode);
115120

116121
var condensed = new ChatBuilder();
117122
condensed.append("Type ").code().append(bot.getTrigger()).append(name());
@@ -127,7 +132,7 @@ public ChatActions onMessage(ChatCommand chatCommand, IBot bot) {
127132
//@formatter:on
128133
}
129134

130-
private String buildLeaderboard(List<Player> players, String websiteUrl) {
135+
private String buildLeaderboard(List<Player> players, String websiteUrl, String joinCode) {
131136
sortPlayersByScoreDescending(players);
132137
var names = buildPlayerNameStrings(players);
133138
var lengthOfLongestName = lengthOfLongestName(names);
@@ -136,6 +141,9 @@ private String buildLeaderboard(List<Player> players, String websiteUrl) {
136141
var cb = new ChatBuilder();
137142
cb.fixedWidth();
138143
cb.append("Leaderboard URL: ").append(websiteUrl).nl();
144+
if (joinCode != null) {
145+
cb.append("Leaderboard join code: ").append(joinCode).nl();
146+
}
139147

140148
var rank = 0;
141149
var prevScore = -1;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package oakbot.command.aoc;
2+
3+
/**
4+
* Represents an Advent of Code leaderboard.
5+
* @param id the leaderboard ID
6+
* @param joinCode the leaderboard join code or null to keep it private
7+
* @author Michael Angstadt
8+
*/
9+
public record AdventOfCodeLeaderboard(String id, String joinCode) {
10+
public AdventOfCodeLeaderboard(String id) {
11+
this(id, null);
12+
}
13+
}

src/test/java/oakbot/command/aoc/AdventOfCodeTest.java

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ void using_default_id() throws Exception {
5555

5656
var api = new AdventOfCodeApi("");
5757

58-
var leaderboardIds = Map.of(1, "123456");
58+
var leaderboards = Map.of(1, new AdventOfCodeLeaderboard("123456", "join-code"));
5959

60-
var aoc = new AdventOfCode("PT0S", leaderboardIds, api);
60+
var aoc = new AdventOfCode("PT0S", leaderboards, api);
6161

6262
//@formatter:off
6363
var message = new ChatCommandBuilder(aoc)
@@ -69,7 +69,7 @@ void using_default_id() throws Exception {
6969
var bot = mock(IBot.class);
7070

7171
var response = aoc.onMessage(message, bot);
72-
assertLeaderboardResponse("123456", response);
72+
assertLeaderboardResponse("123456", "join-code", response);
7373
}
7474

7575
@Test
@@ -83,9 +83,9 @@ void no_default_id() {
8383

8484
var api = new AdventOfCodeApi("");
8585

86-
Map<Integer, String> leaderboardIds = Map.of();
86+
Map<Integer, AdventOfCodeLeaderboard> leaderboards = Map.of();
8787

88-
var command = new AdventOfCode("PT0S", leaderboardIds, api);
88+
var command = new AdventOfCode("PT0S", leaderboards, api);
8989

9090
//@formatter:off
9191
var message = new ChatCommandBuilder(command)
@@ -116,9 +116,9 @@ void override_default_id() throws Exception {
116116

117117
var api = new AdventOfCodeApi("");
118118

119-
var leaderboardIds = Map.of(1, "123456");
119+
var leaderboards = Map.of(1, new AdventOfCodeLeaderboard("123456"));
120120

121-
var aoc = new AdventOfCode("PT0S", leaderboardIds, api);
121+
var aoc = new AdventOfCode("PT0S", leaderboards, api);
122122

123123
//@formatter:off
124124
var message = new ChatCommandBuilder(aoc)
@@ -131,7 +131,7 @@ void override_default_id() throws Exception {
131131
var bot = mock(IBot.class);
132132

133133
var response = aoc.onMessage(message, bot);
134-
assertLeaderboardResponse("098765", response);
134+
assertLeaderboardResponse("098765", null, response);
135135
}
136136

137137
@Test
@@ -145,9 +145,9 @@ void not_active() {
145145

146146
var api = new AdventOfCodeApi("");
147147

148-
Map<Integer, String> leaderboardIds = Map.of();
148+
Map<Integer, AdventOfCodeLeaderboard> leaderboards = Map.of();
149149

150-
var aoc = new AdventOfCode("PT0S", leaderboardIds, api);
150+
var aoc = new AdventOfCode("PT0S", leaderboards, api);
151151

152152
//@formatter:off
153153
var message = new ChatCommandBuilder(aoc)
@@ -173,9 +173,9 @@ void nextRun() {
173173

174174
var api = new AdventOfCodeApi("");
175175

176-
Map<Integer, String> leaderboardIds = Map.of();
176+
Map<Integer, AdventOfCodeLeaderboard> leaderboards = Map.of();
177177

178-
var aoc = new AdventOfCode("PT15M", leaderboardIds, api);
178+
var aoc = new AdventOfCode("PT15M", leaderboards, api);
179179

180180
assertEquals(Duration.ofMinutes(15).toMillis(), aoc.nextRun());
181181
}
@@ -191,9 +191,9 @@ void nextRun_not_december() {
191191

192192
var api = new AdventOfCodeApi("");
193193

194-
Map<Integer, String> leaderboardIds = Map.of();
194+
Map<Integer, AdventOfCodeLeaderboard> leaderboards = Map.of();
195195

196-
var aoc = new AdventOfCode("PT15M", leaderboardIds, api);
196+
var aoc = new AdventOfCode("PT15M", leaderboards, api);
197197

198198
assertTrue(aoc.nextRun() > Duration.ofMinutes(15).toMillis());
199199
}
@@ -260,9 +260,9 @@ void announce_completions() throws Exception {
260260

261261
var api = new AdventOfCodeApi("");
262262

263-
var leaderboardIds = Map.of(1, "123456");
263+
var leaderboards = Map.of(1, new AdventOfCodeLeaderboard("123456"));
264264

265-
var aoc = new AdventOfCode("PT0S", leaderboardIds, api);
265+
var aoc = new AdventOfCode("PT0S", leaderboards, api);
266266

267267
var bot = mock(IBot.class);
268268

@@ -324,9 +324,9 @@ void announce_completions_anon_user() throws Exception {
324324

325325
var api = new AdventOfCodeApi("");
326326

327-
var leaderboardIds = Map.of(1, "123456");
327+
var leaderboards = Map.of(1, new AdventOfCodeLeaderboard("123456"));
328328

329-
var aoc = new AdventOfCode("PT0S", leaderboardIds, api);
329+
var aoc = new AdventOfCode("PT0S", leaderboards, api);
330330

331331
var bot = mock(IBot.class);
332332

@@ -376,9 +376,9 @@ void announce_completions_at_symbol_in_username() throws Exception {
376376

377377
var api = new AdventOfCodeApi("");
378378

379-
var leaderboardIds = Map.of(1, "123456");
379+
var leaderboards = Map.of(1, new AdventOfCodeLeaderboard("123456"));
380380

381-
var aoc = new AdventOfCode("PT0S", leaderboardIds, api);
381+
var aoc = new AdventOfCode("PT0S", leaderboards, api);
382382

383383
var bot = mock(IBot.class);
384384

@@ -392,10 +392,12 @@ void announce_completions_at_symbol_in_username() throws Exception {
392392
verify(bot).sendMessage(1, expected);
393393
}
394394

395-
private static void assertLeaderboardResponse(String expectedId, ChatActions actual) {
395+
private static void assertLeaderboardResponse(String expectedId, String joinCode, ChatActions actual) {
396+
var joinCodeStr = (joinCode == null) ? "" : System.lineSeparator() + " Leaderboard join code: " + joinCode;
397+
396398
//'@' symbols should be removed from usernames
397399
var expected = """
398-
Leaderboard URL: http://adventofcode.com/2017/leaderboard/private/view/%s
400+
Leaderboard URL: http://adventofcode.com/2017/leaderboard/private/view/%s%s
399401
1. gzgreg (score: 312) *****|*****|.....|.....|..... 20 stars
400402
2. Unihedron (score: 306) *****|*****|.....|.....|..... 20 stars
401403
3. geisterfurz007 (score: 230) *****|*****|.....|.....|..... 20 stars
@@ -412,7 +414,7 @@ private static void assertLeaderboardResponse(String expectedId, ChatActions act
412414
13. Michael Prieto (score: 31) **^..|.....|.....|.....|..... 5 stars
413415
14. Simon (score: 26) **.^.|.....|.....|.....|..... 5 stars
414416
15. Hey, Michael, what's up? (score: 0) .....|.....|.....|.....|..... 0 stars
415-
""".formatted(expectedId).stripTrailing();
417+
""".formatted(expectedId, joinCodeStr).stripTrailing();
416418

417419
assertMessage(expected, actual);
418420
}

0 commit comments

Comments
 (0)