From 430bd4944dcd94bb2de90c2d868219bdeaa91cec Mon Sep 17 00:00:00 2001 From: CMDR furrycat Date: Sun, 23 Oct 2016 11:27:58 +0100 Subject: [PATCH] Handle posting multiple feeds to the same channel. --- bot.py | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/bot.py b/bot.py index c451361..41dcbf7 100755 --- a/bot.py +++ b/bot.py @@ -875,19 +875,35 @@ def set_rss_permissions(channel_id): yield from overwrite_permissions(channel, channel.server.default_role, overwrite) @asyncio.coroutine -def do_rss(feed): - date = parse_boolean(feed['date']) if 'date' in feed else True - summary = parse_boolean(feed['summary']) if 'summary' in feed else False - channel = client.get_channel(str(feed['channel_id'])) +def do_rss(feeds): + channel_id = str(feeds[0]['channel_id']) + channel = client.get_channel(channel_id) if not channel: - log.warning("Can't get channel {} for feed {}.".format(feed['channel_id'], feed['url'])) + log.warning("Can't get channel {} for feed.".format(channel_id)) return - url = feed['url'] - d = feedparser.parse(url) - d.entries.reverse() - limit = len(d.entries) + + all_entries = [] + now = time.time() + for feed in feeds: + # Date can be trusted. + date = parse_boolean(feed['date']) if 'date' in feed else True + # Include summary text. + summary = parse_boolean(feed['summary']) if 'summary' in feed else False + url = feed['url'] + d = feedparser.parse(url) + for entry in d.entries: + if date: + order = time.mktime(entry['published_parsed']) + else: + order = now + now += 0.001 + all_entries.append({ 'order': order, 'date': date, 'summary': summary, 'url': feed['url'], 'link_json': feed['link_json'], 'entry': entry }) + all_entries.sort(key = lambda entry: entry['order']) + + limit = len(all_entries) if not limit: limit = 100 + digests = [] logs = yield from client.logs_from(channel, limit = limit) for message in logs: @@ -895,8 +911,10 @@ def do_rss(feed): log.debug('Saw previously posted RSS with digest {}'.format(digest)) if digest not in digests: digests.append(digest) - for entry in d.entries: - formatted = '*{}*\n'.format(entry['published']) if date else '' + + for feed in all_entries: + entry = feed['entry'] + formatted = '*{}*\n'.format(entry['published']) if feed['date'] else '' link = None if 'links' in entry: link = entry['links'][0]['href'] @@ -913,7 +931,7 @@ def do_rss(feed): log.warning('No link for entry {}'.format(entry['title'])) continue formatted += '**{}**\n{}'.format(entry['title'], link) - if summary: + if feed['summary']: formatted += '\n{}'.format(''.join(bs4.BeautifulSoup(entry['summary'], 'html.parser').findAll(text = True))) formatted = formatted.strip() digest = hashlib.sha224(formatted.encode('utf-8')).hexdigest() @@ -941,8 +959,7 @@ def do_feeds(): feeds[feed['channel_id']].append(feed) for channel_id in feeds.keys(): yield from set_rss_permissions(channel_id) - for feed in feeds[channel_id]: - yield from do_rss(feed) + yield from do_rss(feeds[channel_id]) yield from asyncio.sleep(rsstime.value) @asyncio.coroutine -- 2.7.4