bin/pvl.irker
author Tero Marttila <terom@paivola.fi>
Fri, 11 Jan 2013 17:13:11 +0200
changeset 81 448ed86d0510
child 92 715ca17d1260
permissions -rwxr-xr-x
pvl.irker: irker reimplementation in Twisted
#!/usr/bin/python

from twisted.internet import reactor, endpoints, defer
from twisted.python import usage, log

import urlparse

import pvl.irker.irk
import pvl.irker.irc

class Options (usage.Options) :
    optParameters = [
            [ 'irc-nickname', 'n',  pvl.irker.irc.IRCFactory.NICKNAME, "Default IRC nickname" ],
    ]

    def __init__ (self) :
        usage.Options.__init__(self)

        self.listen = []
        self.connect = []
        self.target = []
        self.privmsg = []

    def opt_listen_tcp (self, listen) :
        """
            Twisted endpoint.
        """

        self.listen.append((endpoints.TCP4ServerEndpoint, (int(listen), )))

    def opt_connect (self, connect) :
        """
            Connect to given target.
        """

        self.connect.append(urlparse.urlparse(connect))

    def opt_target (self, target) :
        """
            Join given target.
        """

        self.target.append(urlparse.urlparse(target))

    def opt_privmsg (self, privmsg) :
        """
            Send message to targets
        """

        self.privmsg.append(privmsg)

@defer.inlineCallbacks
def connect (irc, connect) :
    """
        Connect to given urls.
    """
            
    try :
        clients = yield defer.gatherResults([irc.client(url) for url in connect])

    except Exception as ex :
        log.err(ex)
        return

    for client in clients :
        log.msg('--connect', client)

@defer.inlineCallbacks
def target (irc, target, privmsg) :
    """
        Connect to given urls.
    """
            
    try :
        targets = yield defer.gatherResults([irc.target(url) for url in target])

    except Exception as ex :
        log.err(ex)
        return

    for target in targets :
        log.msg('--target', target)

        target.privmsg(*privmsg)

def main (args) :
    options = Options()
    options.parseOptions(args)

    # logging
    log.startLogging(sys.stderr, setStdout=False)

    # connect
    irc = pvl.irker.irc.IRCFactory()
    
    connect(irc, options.connect)
    target(irc, options.target, options.privmsg)

    # listen
    irk = pvl.irker.irk.IrkFactory(irc)

    for endpoint, args in options.listen :
        endpoint = endpoint(reactor, *args)

        log.msg("listen:", endpoint)

        endpoint.listen(irk)


    # go
    reactor.run()

    return 0

if __name__ == '__main__' :
    import sys
    sys.exit(main(sys.argv[1:]))