
# Twisted Imports
from twisted.protocols.irc import IRCClient
from twisted.internet.protocol import ReconnectingClientFactory
from twisted.internet import reactor
from twisted.internet.task import LoopingCall
import sys
import time

import shelve

seen = shelve.open('seen-urls')

import feeds

import time
# Standard Imports
import re

class RSSBot(IRCClient):
    
    def __init__(self):
        self.nickname = "PlanetBot"
        self.lastlol = 0
        self.defChannel = "#rss"
        self.channel = None

    def connectionLost(self, reason):
        IRCClient.connectionLost(self)
        print "Lost:" , reason
	#reactor.stop()
	#sys.exit(1)

    def joined(self, channel):
        # This ensures we'll only interact with this channel
        self.channel = channel
        registerInterest(self)
        l = LoopingCall(self.flushqueue)
        l.start(2)
    
    def privmsg(self, user, channel, message):
        print user, channel, message
                
    def notify(self, msg):
        if not 'entries' in msg:
            return

        seen_before = 0
        for e in msg['entries']:
            if 'link' not in e:
                continue
            if e['link'].encode('utf-8') in seen:
                seen_before += 1
                continue
            seen[ e['link'].encode('utf-8') ] = True
            if self.channel:
                self.queuemsg(self.channel, 
                        (e['link'] + u' ' + e.get('title', u'')).encode('utf-8'))

        print 'seen: %s/%s' % (seen_before, len(msg['entries']))
        seen.sync()

    queue = []

    def queuemsg(self, channel, data):
        print channel, data
        self.queue.append((channel, data))

    def flushqueue(self):
        if self.queue:
            self.msg(*self.queue.pop(0))

    def signedOn(self):
        # when we sign on, join our default channel
        self.msg('nickserv', 'id LovePython')
	time.sleep(2)
        self.join(self.defChannel)

interested = []
def registerInterest(o):
    interested.append(o)

def notifyInterested(feed):
    for i in interested:
        i.notify(feed)

class FeederProtocol(feeds.FeederProtocol):
    def workOnPage(self, parsed_feed, addr):
        feed = super(FeederProtocol, self).workOnPage(parsed_feed, addr)
        notifyInterested(feed)
        return feed

class FeederFactory(feeds.FeederFactory):
    protocol = FeederProtocol()

Factory = ReconnectingClientFactory()
Factory.protocol = RSSBot
reactor.connectTCP("irc.freenode.net", 6667, Factory)
rss = FeederFactory()
l = LoopingCall(rss.start, rss.feeds)
l.start(3600)
reactor.run()
