From 8c9e76b443adc2cd33a65dddd7ac00a39b64f26f Mon Sep 17 00:00:00 2001 From: lassulus Date: Sun, 5 Jan 2014 14:55:17 +0100 Subject: ircbot: refactor and more features --- ircbot/contoller.py | 112 +++++++++++++++++++++++++++++++--------------------- ircbot/new_feeds | 58 +++++++++++++++------------ ircbot/rssbot.py | 32 +++++++++------ 3 files changed, 121 insertions(+), 81 deletions(-) diff --git a/ircbot/contoller.py b/ircbot/contoller.py index cacb81e8..b3938b63 100755 --- a/ircbot/contoller.py +++ b/ircbot/contoller.py @@ -12,8 +12,8 @@ class NewsBot(irc.bot.SingleServerIRCBot): self.chan = chan self.to = timeout -# def start(self): -# self.bot = _thread.start_new_thread(irc.bot.SingleServerIRCBot.start, (self,)) + def start(self): + self.bot = _thread.start_new_thread(irc.bot.SingleServerIRCBot.start, (self,)) # def send(self, string): # if len(string) < 450: @@ -30,60 +30,27 @@ class NewsBot(irc.bot.SingleServerIRCBot): def on_welcome(self, connection, event): connection.join(self.chan) + def send(self, string): + for line in string.split('\n'): + self.connection.privmsg(self.chan, line) + sleep(1) + def on_privmsg(self, connection, event): args_array = event.arguments[0].split() if args_array[0][:-1]==self.name: answer = self.read_message(args_array[1:]) self.send(answer) - def send(self, string): - for line in string.split('\n'): - self.connection.privmsg(self.chan, line) - sleep(0.5) - def on_pubmsg(self, connection, event): self.on_privmsg(connection, event) def read_message(self, args): try: - if args[0] == 'add': - bot = rssbot.RssBot(args[2], args[1]) - bots[args[1]] = bot - bot.start() - return "bot " + args[1] + " added" - - elif args[0] == 'del': - bots[args[1]].stop() - del bots[args[1]] - return "bot " + args[1] + " deleted" - - elif args[0] == 'save': - output_buffer = '' - for bot in bots: - output_buffer += bot + '|' + bots[bot].url + '\n' - - F = open(feedfile, "w") - F.writelines(output_buffer) - F.close() - - return "bots saved to " + feedfile - elif args[0] == 'caps': - return "add del save caps list" - - elif args[0] == 'list': - output_buffer = '' - for bot in bots: - output_buffer += bot + ' url: ' + bots[bot].url + '\n' - return output_buffer - - elif args[0] == 'info': - if args[1] in bots: - return 'title: ' + bots[args[1]].feed.feed.title + '\n' + 'size: ' + len(bots[args[1]].feed.entries) - else: - return 'bot not found' - + if args[0] in [x for x in commands.__dict__.keys() if x.find('_')]: + func = getattr(commands, args[0]) + return func(args) else: - return "unknown command" + return 'command not found' except: return "mimimimi" @@ -105,3 +72,60 @@ for line in lines: bots[linear[0]] = bot knews.start() + + +class commands(): + def add(args): + bot = rssbot.RssBot(args[2], args[1]) + bots[args[1]] = bot + bot.start() + return "bot " + args[1] + " added" + + def delete(args): + bots[args[1]].stop() + del bots[args[1]] + return "bot " + args[1] + " deleted" + + def rename(args): + if args[1] in bots: + if args[2] in bots: + return args[2] + ' already taken' + else: + bots[args[1]].connection.nick(args[2]) + bots[args[1]].name = args[2] + bots[args[2]] = bots[args[1]] + del bots[args[1]] + return 'renamed ' + args[1] + ' in ' + args[2] + else: + return args[1] + ' does not exist' + + def save(args): + output_buffer = '' + for bot in bots: + output_buffer += bot + '|' + bots[bot].url + '\n' + + F = open(feedfile, "w") + F.writelines(output_buffer) + F.close() + + return "bots saved to " + feedfile + + def caps(args): + return ' '.join([x for x in commands.__dict__.keys() if x.find('_')]) + + def list(args): + output_buffer = '' + for bot in bots: + output_buffer += bot + ' url: ' + bots[bot].url + '\n' + return output_buffer + + def info(args): + if args[1] in bots: + output_buffer = '' + for data in ['title', 'link', 'updated']: + if data in bots[args[1]].feed.feed: + output_buffer += data + ': ' + bots[args[1]].feed.feed[data] + '\n' + print(output_buffer) + return output_buffer + else: + return 'bot not found' diff --git a/ircbot/new_feeds b/ircbot/new_feeds index 767b59f2..0a8352bd 100644 --- a/ircbot/new_feeds +++ b/ircbot/new_feeds @@ -1,32 +1,40 @@ -fvwm|http://freecode.com/projects/fvwm/releases.atom -aje|http://www.aljazeera.com/Services/Rss/?PostingId=2007731105943979989 -rt|http://rt.com/rss/news/ -anon|http://anoninsiders.net/feed/ +golem|http://www.golem.de/rss.php?feed=RSS1.0 +ars|http://feeds.arstechnica.com/arstechnica/index?format=xml linuxinsider|http://www.linuxinsider.com/perl/syndication/rssfull.pl +sz|http://suche.sueddeutsche.de/?output=rss +wp_world|http://feeds.washingtonpost.com/rss/rss_blogpost +exploitdb|http://www.exploit-db.com/rss.xml +lolmythesis|http://lolmythesis.com/rss +torr_news|http://feed.torrentfreak.com/Torrentfreak/ +LtU|http://lambda-the-ultimate.org/rss.xml +reuters|http://feeds.reuters.com/Reuters/worldNews +reddit_consp|http://reddit.com/r/conspiracy/.rss +fvwm|http://freecode.com/projects/fvwm/releases.atom +reddit_world|http://www.reddit.com/r/worldnews/.rss +xkcd|https://xkcd.com/rss.xml +coinspotting|http://coinspotting.com/rss antirez|http://antirez.com/rss -lisp|http://planet.lisp.org/rss20.xml +faz_feui|http://www.faz.net/rss/aktuell/feuilleton/ +taz|http://taz.de/Themen-des-Tages/!p15;rss/ +heise|http://heise.de.feedsportal.com/c/35207/f/653902/index.rss reddit_prog|http://reddit.com/r/programming/ -rawstory|http://www.rawstory.com/rs/feed/ -fefe|http://blog.fefe.de/rss.xml -xkcd|https://xkcd.com/rss.xml -slashdot|http://rss.slashdot.org/Slashdot/slashdot -spiegel_top|http://www.spiegel.de/schlagzeilen/tops/index.rss -weechat|http://dev.weechat.org/feed/atom +scmp|http://www.scmp.com/rss/91/feed +faz_politik|http://www.faz.net/rss/aktuell/politik/ +ccc|http://www.ccc.de/rss/updates.rdf +sec-db|http://feeds.security-database.com/SecurityDatabaseToolsWatch +HN|http://news.ycombinator.com/rss spiegel_eil|http://www.spiegel.de/schlagzeilen/eilmeldungen/index.rss reddit_sci|http://www.reddit.com/r/science/.rss -reuters|http://feeds.reuters.com/Reuters/worldNews -HN|http://news.ycombinator.com/rss reddit_tech|http://www.reddit.com/r/technology/.rss -coinspotting|http://coinspotting.com/rss -ccc|http://www.ccc.de/rss/updates.rdf +weechat|http://dev.weechat.org/feed/atom +rawstory|http://www.rawstory.com/rs/feed/ +rt|http://rt.com/rss/news/ archlinux|http://www.archlinux.org/feeds/news/ -reddit_consp|http://reddit.com/r/conspiracy/.rss -scmp|http://www.scmp.com/rss/91/feed -LtU|http://lambda-the-ultimate.org/rss.xml -reddit_world|http://www.reddit.com/r/worldnews/.rss -sec-db|http://feeds.security-database.com/SecurityDatabaseToolsWatch -exploitdb|http://www.exploit-db.com/rss.xml -heise|http://heise.de.feedsportal.com/c/35207/f/653902/index.rss -wp_world|http://feeds.washingtonpost.com/rss/rss_blogpost -ars|http://feeds.arstechnica.com/arstechnica/index?format=xml -golem|http://www.golem.de/rss.php?feed=RSS1.0 +lisp|http://planet.lisp.org/rss20.xml +spiegel_top|http://www.spiegel.de/schlagzeilen/tops/index.rss +fefe|http://blog.fefe.de/rss.xml +anon|http://anoninsiders.net/feed/ +torr_bits|http://feeds.feedburner.com/TorrentfreakBits +faz_wirtschaft|http://www.faz.net/rss/aktuell/wirtschaft/ +slashdot|http://rss.slashdot.org/Slashdot/slashdot +aje|http://www.aljazeera.com/Services/Rss/?PostingId=2007731105943979989 diff --git a/ircbot/rssbot.py b/ircbot/rssbot.py index 008f9fa0..1e1d620d 100755 --- a/ircbot/rssbot.py +++ b/ircbot/rssbot.py @@ -27,7 +27,10 @@ class RssBot(irc.bot.SingleServerIRCBot): self.disconnect() def updateloop(self): - self.feed = feedparser.parse(self.url) + try: + self.feed = feedparser.parse(self.url) + except: + print(self.name + ': rss timeout occured') for entry in self.feed.entries: #try: # self.sendqueue.append(entry.title + " " + entry.link + " com: " + entry.comments) @@ -38,7 +41,10 @@ class RssBot(irc.bot.SingleServerIRCBot): while self.loop: sleep(self.to) - self.feed = feedparser.parse(self.url) + try: + self.feed = feedparser.parse(self.url) + except: + print(self.name + ': rss timeout occured') for entry in self.feed.entries: if not entry.link in self.oldnews: #try: @@ -52,17 +58,19 @@ class RssBot(irc.bot.SingleServerIRCBot): sleep(1) self.send(self.sendqueue.pop()) - def send(self, string): + def send(self, string=''): if self.connection.connected: - if len(string) < 450: - self.connection.privmsg(self.chan, string) - else: - space = 0 - for x in range(math.ceil(len(string)/400)): - oldspace = space - space = string.find(" ", (x+1)*400, (x+1)*400+50) - self.connection.privmsg(self.chan, string[oldspace:space]) - sleep(1) + for line in string.split('\n'): + if len(line) < 450: + self.connection.privmsg(self.chan, line) + 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(self.chan, line[oldspace:space]) + sleep(1) + sleep(1) else: self.connection.reconnect() self.send(string) -- cgit v1.2.3