From 611e23ba942b83422bb7844777ada03e9a2f9113 Mon Sep 17 00:00:00 2001 From: CMDR furrycat Date: Tue, 20 Sep 2016 12:06:41 +0100 Subject: [PATCH] Post RSS feeds. --- bot.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/bot.py b/bot.py index ac62be5..45246c0 100755 --- a/bot.py +++ b/bot.py @@ -1,7 +1,10 @@ #!/usr/bin/env python import asyncio +import bs4 import discord +import feedparser +import hashlib import logging import pexpect import random @@ -21,6 +24,12 @@ fd.close() logging.basicConfig(level = logging.WARN) log = logging.getLogger('discord') +rsstime = 600 +feeds = [ + { 'channel': 227535682283765770, 'url': 'http://proxy.gonegeeky.com/edproxy/', 'date': False }, + { 'channel': 227710451226509312, 'url': 'https://miggy.org/games/elite-dangerous/devtracker/ed-dev-posts.rss', 'summary': True } +] + def wait_for_prompt(p): p.expect('EDI> ') @@ -90,6 +99,15 @@ def do_admin(message, command, raw): elif arg == 'off': log.setLevel(logging.WARN) + elif command == 'rss': + # rss + m = re.match(r'\brss\s+(\d+)\b', raw.lower()) + if m is None: + yield from say(message.channel, 'Sorry!') + return + + rsstime = int(m.group(1)) + yield from maybe_say(message.channel, 'purr') @asyncio.coroutine @@ -140,6 +158,49 @@ def set_role(member, role_name = 'Unassigned', minimum = 1): def set_unassigned(member): yield from set_role(member, 'Unassigned') +@asyncio.coroutine +def do_rss(feed): + date = feed['date'] if 'date' in feed else True + summary = feed['summary'] if 'summary' in feed else False + channel = client.get_channel(str(feed['channel'])) + url = feed['url'] + # Complain if no read_message_history + # Set permissions! + digests = [] + logs = yield from client.logs_from(channel) + for message in logs: + digest = hashlib.sha224(message.content.encode('utf-8')).hexdigest() + log.debug('Saw previously posted RSS with digest {}'.format(digest)) + if digest not in digests: + digests.append(digest) + d = feedparser.parse(url) + d.entries.reverse() + for entry in d.entries: + formatted = '*{}*\n'.format(entry['published']) if date else '' + formatted += '**{}**\n{}'.format(entry['title'], entry['links'][0]['href']) + if 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() + if digest in digests: + log.debug("Already posted RSS with digest {}".format(digest)) + continue + log.info('Posting to {}: {}'.format(channel, formatted)) + try: + message = yield from client.send_message(channel, formatted) + digest = hashlib.sha224(message.content.encode('utf-8')).hexdigest() + digests.append(digest) + log.debug('Posted RSS with digest {}'.format(digest)) + except: + pass + +@asyncio.coroutine +def do_feeds(feeds): + while True: + for feed in feeds: + yield from do_rss(feed) + yield from asyncio.sleep(rsstime) + p = pexpect.spawnu('./edi.py') wait_for_prompt(p) @@ -147,7 +208,7 @@ modules = { 'admin': { 'fn': do_admin, 'args': [], - 'commands': ['avatar', 'debug'] + 'commands': ['avatar', 'debug', 'rss'] }, 'edi': { 'fn': do_edi, @@ -182,6 +243,7 @@ def on_ready(): print('Admins are: {}'.format(admins)) for member in client.get_all_members(): yield from set_unassigned(member) + yield from do_feeds(feeds) @client.event @asyncio.coroutine -- 2.7.4