diff options
Diffstat (limited to 'knn/rssbot.py')
-rwxr-xr-x | knn/rssbot.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/knn/rssbot.py b/knn/rssbot.py new file mode 100755 index 00000000..87c58781 --- /dev/null +++ b/knn/rssbot.py @@ -0,0 +1,116 @@ +#!/usr/bin/python +import irc.bot +from irc.client import IRC +import feedparser +import threading +import math +import re +import subprocess +from datetime import datetime +from time import sleep + +class RssBot(irc.bot.SingleServerIRCBot): + def __init__(self, rss, name, chans=['#news'], url_shortener="http://localhost", server='ire', port=6667, timeout=60): + irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], name, name) + self.url = rss + self.name = name + self.server = server + self.port = port + self.chans = chans + self.to = timeout + self.oldnews = [] + self.sendqueue = [] + self.loop = True + self.lastnew = datetime.now() + self.url_shortener = url_shortener + + def better_loop(timeout=0.2): + while self.loop: + self.ircobj.process_once(timeout) + self.ircobj.process_forever = better_loop + + + def start(self): + self.upd_loop = threading.Thread(target=self.updateloop) + self.bot = threading.Thread(target=irc.bot.SingleServerIRCBot.start, args=(self,)) + self.upd_loop.start() + self.bot.start() + + def stop(self): + self.ircobj.disconnect_all() + self.loop = False + del self + + def updateloop(self): + failcount=0 + while True: + try: + self.feed = feedparser.parse(self.url) + for entry in self.feed.entries: + self.oldnews.append(entry.link) + break + except: + print(self.name + ': rss timeout occured') + failcount+=1 + if failcount>20: + print(self.name + ' is broken, going to die') + self.stop() + return + while self.loop: + try: + self.feed = feedparser.parse(self.url) + for entry in self.feed.entries: + if not entry.link in self.oldnews: + #try: + # self.send(entry.title + " " + entry.link + " com: " + entry.comments) + #except AttributeError: + shorturl = self.shortenurl(entry.link) + self.sendall(entry.title + ' ' + shorturl) + self.oldnews.append(entry.link) + self.lastnew = datetime.now() + except: + print(self.name + ': rss timeout occured') + sleep(self.to) + + def shortenurl(self, url): + while True: + try: + shorturl = subprocess.check_output(["curl", "-sS", "-F", "uri=" + url, self.url_shortener]).decode().strip('\n').strip('\r') + '#' + url.partition('://')[2].partition('/')[0] + return shorturl + except: + print('url shortener error') + sleep(1) + + def last(self, target, num): + for feed in [x for x in self.feed.entries][:num]: + self.send(target, feed.title + ' ' + self.shortenurl(feed.link)) + + def sendall(self, string): + for chan in self.channels: + self.send(chan, string) + + def send(self, target, string): + if self.connection.connected: + for line in string.split('\n'): + if len(line) < 450: + self.connection.privmsg(target, line) + sleep(1) + else: + space = 0 + for x in range(math.ceil(len(line)/400)): + oldspace = space + space = line.find(" ", (x+1)*400, (x+1)*400+50) + self.connection.privmsg(target, line[oldspace:space]) + sleep(1) + else: + self.connection.reconnect() + sleep(1) + self.send(string) + + def on_invite(self, connection, event): + for chan in event.arguments: + connection.join(chan) + + def on_welcome(self, connection, event): + for chan in self.chans: + connection.join(chan) |