-
Notifications
You must be signed in to change notification settings - Fork 0
/
FeedHandler.scala
31 lines (24 loc) · 922 Bytes
/
FeedHandler.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package opmlalerts
import akka.actor.typed._
import akka.actor.typed.scaladsl.Behaviors
import java.net.URL
import java.time.Instant
object FeedHandler {
sealed trait Command
final case class GetNewEntries(replyTo: ActorRef[NewEntry])
extends Command
final case class NewEntry(entry: Parser.FeedEntry)
}
case class FeedHandler(feedURL: URL) {
import FeedHandler._
def getNewEntriesSince(lastPoll: Instant): Behavior[Command] =
Behaviors.immutable { case (ctx, GetNewEntries(replyTo)) ⇒
ctx.system.log.debug("Fetching and parsing feed {}", feedURL)
val pollTime = Instant.now
val entries = Parser(ctx.system.log).parseFeed(feedURL)
val newEntries = entries filter { _.date isAfter lastPoll }
newEntries foreach { replyTo ! NewEntry(_) }
ctx.system.log.info("Feed {} has {} new entries", feedURL, newEntries.length)
getNewEntriesSince(pollTime)
}
}