From 993cb2355cfecfc88bd143881eabb9b687ed0348 Mon Sep 17 00:00:00 2001 From: ssdaniel24 <107036969+ssdaniel24@users.noreply.github.com> Date: Sat, 7 Dec 2024 11:38:53 +0000 Subject: [PATCH] Add --random flag for 'rss' command --- plugins/RSS/plugin.py | 20 +++++++++++++++----- plugins/RSS/test.py | 6 ++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/plugins/RSS/plugin.py b/plugins/RSS/plugin.py index 29e0edd0e..cba29de23 100644 --- a/plugins/RSS/plugin.py +++ b/plugins/RSS/plugin.py @@ -36,6 +36,7 @@ import json import time import types import string +import random import socket import threading import feedparser @@ -170,6 +171,9 @@ def sort_feed_items(items, order): """Return feed items, sorted according to sortFeedItems.""" if order == 'asInFeed': return items + elif order == 'random': + random.shuffle(items) + return items (key, reverse) = _sort_arguments(order) try: sitems = sorted(items, key=key, reverse=reverse) @@ -695,11 +699,12 @@ class RSS(callbacks.Plugin): channels = wrap(channels, ['feedName']) @internationalizeDocstring - def rss(self, irc, msg, args, url, n): - """ [] + def rss(self, irc, msg, args, optlist, url, n): + """[--random] [] Gets the title components of the given RSS feed. If is given, return only that many headlines. + Use --random flag for random sorting of entries. """ self.log.debug('Fetching %u', url) try: @@ -719,17 +724,22 @@ class RSS(callbacks.Plugin): s += str(feed.last_exception) irc.error(s) return - n = n or self.registryValue('defaultNumberOfHeadlines', channel, irc.network) entries = list(filter(lambda e:self.should_send_entry(irc.network, channel, e), feed.entries)) - entries = sort_feed_items(entries, 'newestFirst') + order = 'newestFirst' + if 'random' in (k for k,v in optlist): + order = 'random' + entries = sort_feed_items(entries, order) + n = n or self.registryValue('defaultNumberOfHeadlines', channel, irc.network) entries = entries[:n] entries = sort_feed_items(entries, self.registryValue('sortFeedItems')) headlines = map(lambda e:self.format_entry(irc.network, channel, feed, e, False), entries) sep = self.registryValue('headlineSeparator', channel, irc.network) irc.replies(headlines, joiner=sep) - rss = wrap(rss, [first('url', 'feedName'), additional('int')]) + rss = wrap(rss, [getopts({ 'random': '', }), + first('url', 'feedName'), + additional('int')]) @internationalizeDocstring def info(self, irc, msg, args, url): diff --git a/plugins/RSS/test.py b/plugins/RSS/test.py index 494b1e9b0..2e8a3c761 100644 --- a/plugins/RSS/test.py +++ b/plugins/RSS/test.py @@ -571,6 +571,12 @@ class RSSTestCase(ChannelPluginTestCase): m = self.assertNotError('rss %s 2' % url) self.assertEqual(m.args[1].count(' | '), 1) + def testRssRandom(self): + timeFastForward(1.1) + self.assertNotError('rss --random %s' % url) + m = self.assertNotError('rss --random %s 2' % url) + self.assertEqual(m.args[1].count(' | '), 1) + def testRssAdd(self): timeFastForward(1.1) self.assertNotError('rss add advogato %s' % url)