summaryrefslogtreecommitdiffstats
path: root/knn/rssbot.py
diff options
context:
space:
mode:
Diffstat (limited to 'knn/rssbot.py')
-rwxr-xr-xknn/rssbot.py116
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)