pvl/irker/irc.py
author Tero Marttila <terom@paivola.fi>
Sun, 13 Jan 2013 03:30:11 +0200
changeset 127 f143171884f9
parent 110 af87b706e4a3
child 168 4e120851ff52
permissions -rw-r--r--
pvl.irker: implement part
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    IRC client, dispatching irker messages.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
from twisted.internet import reactor, interfaces, protocol, defer, error
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
from twisted.words.protocols import irc
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
from twisted.internet import endpoints
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
from twisted.python import log
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
PORT = 6667
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
def url2endpoint (reactor, url) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
        Turn given urlparse URL into an endpoint.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
        Raises KeyError on unknown scheme.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
    SCHEMES = {
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
            'irc':      lambda : endpoints.TCP4ClientEndpoint(reactor, url.hostname, url.port or PORT),
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
    }
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
    return SCHEMES[url.scheme]()
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
def normalize (name) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        Normalize a channel/nickname for comparisons in IRC.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    return name.lower()
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
class IRCError (Exception) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        A handled protocol error.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    pass
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
class IRCChannel (object) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        A joined channel on an IRC server.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    ENCODING = 'utf-8'
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    def __init__ (self, client, channel, encoding=ENCODING) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        self.client = client
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        self.channel = channel
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
        self.encoding = encoding
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
127
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    54
    def encode (self, unicode) :
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    55
        if unicode :
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    56
            return unicode.encode(self.encoding)
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    57
        else :
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    58
            return None
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    59
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    def privmsg (self, *msgs) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        for msg in msgs :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
            # XXX: encode
127
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    63
            self.client.msg(self.channel, self.encode(msg))
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 81
diff changeset
    65
    def notice (self, *msgs) :
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 81
diff changeset
    66
        for msg in msgs :
127
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    67
            self.client.notice(self.channel, self.encode(msg))
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    68
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    69
    def part (self, msg=None) :
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    70
        """
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    71
            Remove channel from our list of channels.
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    72
        """
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    73
f143171884f9 pvl.irker: implement part
Tero Marttila <terom@paivola.fi>
parents: 110
diff changeset
    74
        self.client.leave(self.channel, self.encode(msg))
83
1cb48f2ba1e9 pvl.irker/irk: implement support for NOTICE
Tero Marttila <terom@paivola.fi>
parents: 81
diff changeset
    75
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    def errback (self, failure) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
            Fail any pending requests.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
        log.msg('IRCChannel.errback', self, failure)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    def __str__ (self) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
        return self.client.url(self.channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
class IRCClient (irc.IRCClient) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        A connection to an IRC server with a specific, requested nickname.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
        Joins to channels.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    performLogin = False
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    def __init__ (self, factory) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        self.factory = factory
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        self.nickname = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        self.hostname = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        self._registering = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        self._channels = { }
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
84
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   104
        # TODO: smarter/configurable queueing?
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   105
        self.lineRate = 1.0
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   106
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
    def connectionMade (self) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        self.hostname = self.transport.getPeer().host
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
        self.transport.logPrefix = self.logPrefix
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        log.msg("connectionMade", self, self.transport)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
        irc.IRCClient.connectionMade(self)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
    def sendLine (self, line) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
        irc.IRCClient.sendLine(self, line)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        log.msg(">>>", line)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
    def lineReceived (self, line) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        log.msg("<<<", line)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        irc.IRCClient.lineReceived(self, line)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
    ## Register
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    def register (self, nickname, username=None, password=None) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
            Register to the server, choosing a nickname based on the given nickname.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
            Returns a Deferred that callbacks with our actual nickname once we have registered, or errbacks with an IRCError.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
        if self._registering :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
            raise Exception("register: already registering")
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
        self.username = username
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
        self.password = password
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        log.msg("register", nickname)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
        irc.IRCClient.register(self, nickname)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        # defer
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        d = self._registering = defer.Deferred()
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        return d
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
    
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
    # irc_ERR_NICKNAMEINUSE
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
    # alterCollidedNick
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
    # irc_ERR_ERRONEUSNICKNAME
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
    def irc_ERR_PASSWDMISMATCH (self, prefix, params) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
        err = IRCError('ERR_PASSWDMISMATCH')
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
        log.err(err)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
        self._registering.errback(err)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
    def irc_RPL_WELCOME (self, prefix, params) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
        self.hostname = prefix
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
        irc.IRCClient.irc_RPL_WELCOME(self, prefix, params)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
    def signedOn (self) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        log.msg("signedOn", self.nickname)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
        irc.IRCClient.signedOn(self)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
        # defer
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
        d = self._registering
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
        if not d :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
            raise Exception("signedOn: not registering?")
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
        self._registering = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
        d.callback(self.nickname)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
    
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
    ## Channels
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
    def join (self, channel, key=None) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
            Join the given channel.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
            Returns a deferred that callbacks with the IRCChannel once joined, or errbacks.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
        irc.IRCClient.join(self, channel, key=key)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
        d = self._channels[normalize(channel)] = defer.Deferred()
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
        return d
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
    # ERR_CHANNELISFULL
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
    # ERR_INVITEONLYCHAN
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
    # ERR_BANNEDFROMCHAN
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
    # ERR_BADCHANNELKEY
84
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   191
    
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   192
    def _close_channel (self, channel) :
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   193
        """
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   194
            Remove channel from our list of channels.
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   195
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   196
            TODO: purge queued messages for channel?
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   197
        """
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   198
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   199
        del self._channels[normalize(channel)]
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   200
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   201
    def left (self, channel) :
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   202
        log.msg('IRCClient.left', channel)
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   203
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   204
        self._close_channel(channel)
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   205
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   206
    def kickedFrom (self, channel, kicker, message) :
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   207
        log.msg('IRCClient.kicked', channel, kicker, message)
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   208
        
e5f36ec2e8d2 pvl.irker.irc: handle channel kick/part
Tero Marttila <terom@paivola.fi>
parents: 83
diff changeset
   209
        self._close_channel(channel)
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
    def joined (self, channel) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
            Have joined given channel.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
        lookup = normalize(channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        d = self._channels[lookup]
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
        channel = self._channels[lookup] = IRCChannel(self, channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
        d.callback(channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
    @defer.inlineCallbacks
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
    def channel (self, channel, key=None) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
            Defer a joined IRCChannel.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
        lookup = normalize(channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
        log.msg('IRCClient.channel', lookup, channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
        if lookup not in self._channels :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
            channel = yield self.join(channel, key)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
        else :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
            # wait or get
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
            yield self._channels[lookup]
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
        channel = self._channels[lookup]
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
        log.msg('IRCClient.channel', lookup, channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
        defer.returnValue(channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
    ## 
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
    def irc_ERR_CANNOTSENDTOCHAN (self, prefix, params) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
        nick, channel, error = params
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
        log.err(IRCError(channel, error))
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
    ## Quit
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
    def irc_ERROR (self, prefix, params) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
        msg, = params
110
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   253
        error = IRCError(None, msg)
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
110
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   255
        log.err(error)
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   256
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   257
        if self._registering :
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   258
            self._registering.errback(error)
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   259
            self._registering = None
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
    def connectionLost (self, reason) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
        irc.IRCClient.connectionLost(self, reason)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
        log.err(reason)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
        if self._registering :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
            self._registering.errback(reason)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
            self._registering = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
        # unregister channels
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
        for channel in self._channels :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
            # errback Deferred or IRCChannel
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
            self._channels[channel].errback(reason)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
        self._channels = { }
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
        # unregister client
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
        self.factory.clientLost(self)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
    
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   279
    ## Logging
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   280
    def url (self, target=None) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
            Format as URL.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
        """
93
d85d825cbca7 pvl.irker: handle missing transport in logPrefix (only happens when daemonized, for whatever reason)
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   284
d85d825cbca7 pvl.irker: handle missing transport in logPrefix (only happens when daemonized, for whatever reason)
Tero Marttila <terom@paivola.fi>
parents: 84
diff changeset
   285
        if not self.transport : return 'IRC'
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   287
        # XXX: no isinstance() support
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   288
        if interfaces.ITCPTransport.providedBy(self.transport) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   289
            scheme = 'irc'
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
        else :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
            # TODO: ssl?
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
            scheme = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
        peer = self.transport.getPeer()
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   295
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
        if peer.port == PORT :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
            peer = "{irc.hostname}".format(irc=self, peer=peer)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
        else :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
            peer = "{irc.hostname}:{peer.port}".format(irc=self, peer=peer)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
        if target :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
            path = str(target)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
        else :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
            path = None
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
        return ''.join(part for part in (
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   307
            scheme, '://' if scheme else None,
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   308
            self.nickname, '@' if self.nickname else None,
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
            peer,
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
            '/' if path else None, path
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
        ) if part)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
    __str__ = url
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
    logPrefix = url
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   316
class IRCFactory (protocol.ClientFactory) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
        Manage Clients and Targets
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
    """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
    NICKNAME = 'irker'
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
108
d2c1485af725 pvl.irker: implement irc username
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   323
    def __init__ (self, nickname=NICKNAME, username=None) :
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
        # default nickname
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   325
        self.nickname = nickname
110
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   326
        self.username = username
108
d2c1485af725 pvl.irker: implement irc username
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   327
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
        # (scheme, host, port, nick) -> IRCClient
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
        self.clients = {}
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   330
    
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   331
    def buildProtocol (self, addr) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
        return IRCClient(self)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   333
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
    def clientLost (self, client) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   336
            Given IRCClient is no more.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   337
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
        log.msg("IRCFactory.clientLost", client)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   341
        # remove from our clients
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342
        self.clients = dict((k, c) for k, c in self.clients.iteritems() if c != client)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
    @defer.inlineCallbacks
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
    def connect (self, url) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
            Defer a connected, registered Client for given URL.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   348
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   350
        endpoint = url2endpoint(reactor, url)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   351
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   352
        log.msg('IRCFactory.connect', url, ':', endpoint)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   354
        # connect
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   355
        try :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   356
            client = yield endpoint.connect(self)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   357
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   358
        except error.ConnectError as ex :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   359
            log.err(ex, ': '.join(str(x) for x in ('IRCFactory.connect', url, endpoint)))
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   360
            raise
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   361
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   362
        else :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   363
            log.msg('IRCFactory.connect', url, ':', endpoint, ':', client)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   364
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   365
        # register
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   366
        try :
108
d2c1485af725 pvl.irker: implement irc username
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   367
            nickname = yield client.register(url.username or self.nickname, 
d2c1485af725 pvl.irker: implement irc username
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   368
                    username    = self.username,
d2c1485af725 pvl.irker: implement irc username
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   369
                    password    = url.password, 
d2c1485af725 pvl.irker: implement irc username
Tero Marttila <terom@paivola.fi>
parents: 93
diff changeset
   370
            )
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   371
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   372
        except Exception as ex :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   373
            log.err("register", ex)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   374
            raise
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   376
        log.msg('IRCFactory.connect', url, ':', endpoint, ':', client, ':', nickname)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   377
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   378
        # okay!
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   379
        defer.returnValue(client)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   380
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   381
    @defer.inlineCallbacks
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   382
    def client (self, url) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   383
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   384
            Return IRCClient for given URL.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   385
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   386
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   387
        lookup = (url.scheme, url.hostname, url.port, url.username)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   388
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   389
        if lookup not in self.clients :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   390
            # deferred for connect
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   391
            connect = self.clients[lookup] = self.connect(url)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   392
            
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   393
            try :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   394
                # wait on deferred, and then store IRCClient
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   395
                self.clients[lookup] = yield connect
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   396
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   397
            except Exception as ex :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   398
                # failed, remove the attempted connect
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   399
                del self.clients[lookup]
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   400
                raise
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   401
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   402
        else :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   403
            # wait for result, if deferred
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   404
            # XXX: this yields None, since the first inlineCallbacks yielding on the deferred returns None in its callback
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   405
            yield self.clients[lookup]
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   406
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   407
        # connected client
110
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   408
        client = self.clients.get(lookup)
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   409
110
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   410
        if client :
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   411
            log.msg('IRCFactory.client', url, ":", client)
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   412
110
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   413
            defer.returnValue(client)
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   414
        else :
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   415
            log.msg('IRCFactory.client', url, ": client connect failed")
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   416
            
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   417
            # XXX: get failure from first yield's errback... except inlineCallbacks drops it and goes to callback with None <_<
af87b706e4a3 pvl.irker: implement --irc-username option; improve handling of register errors
Tero Marttila <terom@paivola.fi>
parents: 108
diff changeset
   418
            raise Exception("Client connect failed")
81
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   419
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   420
    @defer.inlineCallbacks
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   421
    def target (self, url) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   422
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   423
            Return IRCChannel for given URL.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   424
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   425
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   426
        client = yield self.client(url)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   427
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   428
        channel = '#' + url.path.lstrip('/')
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   429
        channel = yield client.channel(channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   430
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   431
        log.msg('IRCFactory.target', url, ":", channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   432
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   433
        defer.returnValue(channel)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   434
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   435
    @defer.inlineCallbacks
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   436
    def privmsg (self, url, *msg) :
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   437
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   438
            Dispatch given messages to given target.
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   439
        """
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   440
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   441
        target = yield self.target(url)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   442
        
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   443
        log.msg('IRCFactory.privmsg', url, ":", target, ':', *msg)
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   444
448ed86d0510 pvl.irker: irker reimplementation in Twisted
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   445
        target.privmsg(*msg)