23
23
24
24
import javax .annotation .Nonnull ;
25
25
26
+ import java .io .IOException ;
26
27
import java .time .LocalDateTime ;
27
28
import java .time .ZoneId ;
28
29
import java .time .ZonedDateTime ;
64
65
public final class RSSHandlerRoutine implements Routine {
65
66
66
67
private static final Logger logger = LoggerFactory .getLogger (RSSHandlerRoutine .class );
67
- private static final RssReader RSS_READER = new RssReader ();
68
68
private static final int MAX_CONTENTS = 1000 ;
69
69
private static final ZonedDateTime ZONED_TIME_MIN =
70
70
ZonedDateTime .of (LocalDateTime .MIN , ZoneId .systemDefault ());
71
+ private final RssReader rssReader ;
71
72
private final List <RSSFeed > feeds ;
72
73
private final Predicate <String > defaultChannelPattern ;
73
- private final Map <RSSFeed , Predicate <String >> targetChannelPatterns = new HashMap <>() ;
74
+ private final Map <RSSFeed , Predicate <String >> targetChannelPatterns ;
74
75
private final int interval ;
75
76
private final Database database ;
76
77
@@ -86,13 +87,15 @@ public RSSHandlerRoutine(Config config, Database database) {
86
87
this .database = database ;
87
88
this .defaultChannelPattern =
88
89
Pattern .compile (config .getJavaNewsChannelPattern ()).asMatchPredicate ();
90
+ this .targetChannelPatterns = new HashMap <>();
89
91
this .feeds .forEach (feed -> {
90
92
if (feed .targetChannelPattern () != null ) {
91
93
Predicate <String > predicate =
92
94
Pattern .compile (feed .targetChannelPattern ()).asMatchPredicate ();
93
95
targetChannelPatterns .put (feed , predicate );
94
96
}
95
97
});
98
+ this .rssReader = new RssReader ();
96
99
}
97
100
98
101
@ Override
@@ -141,7 +144,7 @@ private void sendRSS(JDA jda, RSSFeed feedConfig) throws DateTimeParseException
141
144
.fetchAny ());
142
145
143
146
String dateStr = dateResult == null ? null : dateResult .getLastDate ();
144
- ZonedDateTime lastSavedDate = getLocalDateTime (dateStr , feedConfig .dateFormatterPattern ());
147
+ ZonedDateTime lastSavedDate = getZonedDateTime (dateStr , feedConfig .dateFormatterPattern ());
145
148
146
149
final Predicate <Item > shouldItemBePosted = item -> {
147
150
ZonedDateTime itemPubDate =
@@ -205,7 +208,7 @@ private static ZonedDateTime getDateTimeFromItem(Item item, String dateTimeForma
205
208
return ZONED_TIME_MIN ;
206
209
}
207
210
208
- return getLocalDateTime (pubDate , dateTimeFormat );
211
+ return getZonedDateTime (pubDate , dateTimeFormat );
209
212
}
210
213
211
214
/**
@@ -223,7 +226,7 @@ private static boolean isValidDateFormat(List<Item> rssFeeds, RSSFeed feedConfig
223
226
return false ;
224
227
}
225
228
226
- getLocalDateTime (firstRssFeedPubDate , feedConfig .dateFormatterPattern ());
229
+ getZonedDateTime (firstRssFeedPubDate , feedConfig .dateFormatterPattern ());
227
230
} catch (Exception e ) {
228
231
return false ;
229
232
}
@@ -261,7 +264,7 @@ private static EmbedBuilder constructEmbedMessage(Item item, RSSFeed feedConfig)
261
264
// Set the item's timestamp to the embed if found
262
265
item .getPubDate ()
263
266
.ifPresent (date -> embedBuilder
264
- .setTimestamp (getLocalDateTime (date , feedConfig .dateFormatterPattern ())));
267
+ .setTimestamp (getZonedDateTime (date , feedConfig .dateFormatterPattern ())));
265
268
266
269
embedBuilder .setTitle (title , titleLink );
267
270
embedBuilder .setAuthor (item .getChannel ().getLink ());
@@ -288,10 +291,10 @@ private static EmbedBuilder constructEmbedMessage(Item item, RSSFeed feedConfig)
288
291
/**
289
292
* Fetches a list of {@link Item} from a given RSS url.
290
293
*/
291
- private static List <Item > fetchRss (String rssUrl ) {
294
+ private List <Item > fetchRss (String rssUrl ) {
292
295
try {
293
- return RSS_READER .read (rssUrl ).toList ();
294
- } catch (Exception e ) {
296
+ return rssReader .read (rssUrl ).toList ();
297
+ } catch (IOException e ) {
295
298
logger .warn ("Could not fetch RSS from URL ({})" , rssUrl );
296
299
return List .of ();
297
300
}
@@ -300,8 +303,9 @@ private static List<Item> fetchRss(String rssUrl) {
300
303
/**
301
304
* Helper function for parsing a given date value to a {@link ZonedDateTime} with a given
302
305
* format.
306
+ *
303
307
*/
304
- private static ZonedDateTime getLocalDateTime (@ Nullable String date , @ NotNull String format ) {
308
+ private static ZonedDateTime getZonedDateTime (@ Nullable String date , @ NotNull String format ) throws DateTimeParseException {
305
309
if (date == null ) {
306
310
return ZONED_TIME_MIN ;
307
311
}
0 commit comments