Add --random flag for 'rss' command

This commit is contained in:
ssdaniel24 2024-12-07 11:38:53 +00:00 committed by GitHub
parent 941d3121eb
commit 993cb2355c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 5 deletions

View File

@ -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):
"""<name|url> [<number of headlines>]
def rss(self, irc, msg, args, optlist, url, n):
"""[--random] <name|url> [<number of headlines>]
Gets the title components of the given RSS feed.
If <number of headlines> 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):

View File

@ -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)