diff --git a/rss/bot.py b/rss/bot.py index 0352f4c..712b38c 100644 --- a/rss/bot.py +++ b/rss/bot.py @@ -341,6 +341,25 @@ async def can_manage(self, evt: MessageEvent) -> bool: async def rss(self) -> None: pass + @rss.subcommand("latest", aliases=("l",), help="Get latest item for each feed.") + async def get_latest(self, evt: MessageEvent) -> None: + subs = await self.dbm.get_feeds() + subscriptions = await self.dbm.get_feeds_by_room(evt.room_id) + #feed, subscriber + + if not subs: + return + + self.log.info(f"Polling {len(subs)} feeds") + for feed in subs: + entries = await self.dbm.get_entries(feed.id, 1) + for old_entry in entries: + for s in feed.subscriptions: + if s.room_id == evt.room_id: + su =s + await self._send(feed, old_entry, su) + self.log.info(f"Finished polling {len(subs)} feeds") + @rss.subcommand("subscribe", aliases=("s", "sub"), help="Subscribe this room to a feed.") @command.argument("url", "feed URL", pass_raw=True) async def subscribe(self, evt: MessageEvent, url: str) -> None: diff --git a/rss/db.py b/rss/db.py index e6faa88..a991069 100644 --- a/rss/db.py +++ b/rss/db.py @@ -143,8 +143,19 @@ async def get_feeds_by_room(self, room_id: RoomID) -> list[tuple[Feed, UserID]]: return [(Feed.from_row(row), row["user_id"]) for row in rows] async def get_entries(self, feed_id: int) -> list[Entry]: + return await self.get_entries(feed_id=feed_id,limit=0) + + async def get_entries(self, feed_id: int, limit: int=0, orderDesc: bool=True) -> list[Entry]: q = "SELECT feed_id, id, date, title, summary, link FROM entry WHERE feed_id = $1" - return [Entry.from_row(row) for row in await self.db.fetch(q, feed_id)] + if limit == 0: + return [Entry.from_row(row) for row in await self.db.fetch(q, feed_id)] + elif orderDesc: + q += " order by id DESC" + elif not orderDesc: + q += " order by id ASC" + q += " limit $2" + + return [Entry.from_row(row) for row in await self.db.fetch(q, feed_id, limit)] async def add_entries(self, entries: list[Entry], override_feed_id: int | None = None) -> None: if not entries: