aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2019-08-09 16:48:41 +0100
committerGravatar jesopo2019-08-09 16:48:41 +0100
commitfc765228ebe65387298ee7d71284776159baeb31 (patch)
treecf51d1be597c6f1338810089b377c1949a8a5a5f
parentv1.11.0-rc1 release (diff)
signature
implement `!rss read <url>`
closes #94
-rw-r--r--modules/rss.py25
1 files changed, 21 insertions, 4 deletions
diff --git a/modules/rss.py b/modules/rss.py
index 2ab3dbff..5c62cddb 100644
--- a/modules/rss.py
+++ b/modules/rss.py
@@ -91,7 +91,10 @@ class Module(ModuleManager.BaseModule):
total_milliseconds = (time.monotonic() - start_time) * 1000
self.log.trace("Polled RSS feeds in %fms", [total_milliseconds])
- def _check_url(self, url):
+ def _get_id(self, entry):
+ return entry.get("id", entry["link"])
+
+ def _get_entries(self, url, max: int=None):
try:
data = utils.http.request(url)
feed = feedparser.parse(data.data)
@@ -99,12 +102,12 @@ class Module(ModuleManager.BaseModule):
self.log.warn("failed to parse RSS %s", [url], exc_info=True)
feed = None
if not feed or not feed["feed"]:
- return None
+ return None, None
entry_ids = []
for entry in feed["entries"]:
entry_ids.append(entry.get("id", entry["link"]))
- return entry_ids
+ return feed["feed"].get("title", None), feed["entries"][:max]
@utils.hook("received.command.rss", min_args=1, channel_only=True)
def rss(self, event):
@@ -131,9 +134,11 @@ class Module(ModuleManager.BaseModule):
if url in rss_hooks:
raise utils.EventError("That URL is already being watched")
- seen_ids = self._check_url(url)
+ title, entries = self._get_entries(url)
if seen_ids == None:
raise utils.EventError("Failed to read feed")
+
+ seen_ids = [self._get_id(e) for e in entries]
event["target"].set_setting("rss-seen-ids-%s" % url, seen_ids)
rss_hooks.append(url)
@@ -149,6 +154,18 @@ class Module(ModuleManager.BaseModule):
rss_hooks.remove(url)
changed = True
message = "Removed RSS feed"
+ elif subcommand == "read":
+ if not len(event["args_split"]) > 1:
+ raise utils.EventError("Please provide a url")
+
+ title, entries = self._get_entries(event["args_split"][1])
+ if not entries:
+ raise utils.EventError("Failed to get RSS entries")
+
+ shorten = event["target"].get_setting("rss-shorten", False)
+ out = self._format_entry(event["server"], title, entries[0],
+ shorten)
+ event["stdout"].write(out)
else:
raise utils.EventError("Unknown subcommand '%s'" % subcommand)