X-Git-Url: https://jfr.im/git/irc/quakenet/qwebirc.git/blobdiff_plain/b60ea11d364f85af1eb4dd188fc5af5e2bfae8e7..5d52e82c35f1b30aecf3fa47a207e17b48c1710e:/qwebirc/ircclient.py diff --git a/qwebirc/ircclient.py b/qwebirc/ircclient.py index 7252669..8e06eae 100644 --- a/qwebirc/ircclient.py +++ b/qwebirc/ircclient.py @@ -1,12 +1,17 @@ import twisted, sys, codecs, traceback from twisted.words.protocols import irc -from twisted.internet import reactor, protocol +from twisted.internet import reactor, protocol, abstract from twisted.web import resource, server from twisted.protocols import basic - -import hmac, time, config, qwebirc.config_options as config_options +from twisted.names.client import Resolver +import hmac, time, config, random, qwebirc.config_options as config_options from config import HMACTEMPORAL +if config.get("CONNECTION_RESOLVER"): + CONNECTION_RESOLVER = Resolver(servers=config.get("CONNECTION_RESOLVER")) +else: + CONNECTION_RESOLVER = None + if hasattr(config, "WEBIRC_MODE") and config.WEBIRC_MODE == "hmac": HMACKEY = hmac.HMAC(key=config.HMACKEY) @@ -140,18 +145,27 @@ class QWebIRCFactory(protocol.ClientFactory): self.publisher.disconnect() def createIRC(*args, **kwargs): - resolver = config.get("CONNECTION_RESOLVER") f = QWebIRCFactory(*args, **kwargs) - if resolver is None: - reactor.connectTCP(config.IRCSERVER, config.IRCPORT, f) + + tcpkwargs = {} + if hasattr(config, "OUTGOING_IP"): + tcpkwargs["bindAddress"] = (config.OUTGOING_IP, 0) + + if CONNECTION_RESOLVER is None: + if hasattr(config, "SSLPORT"): + from twisted.internet import ssl + reactor.connectSSL(config.IRCSERVER, config.SSLPORT, f, ssl.ClientContextFactory(), **tcpkwargs) + else: + reactor.connectTCP(config.IRCSERVER, config.IRCPORT, f, **tcpkwargs) return f - def callback(addr): - reactor.connectTCP(addr, config.IRCPORT, f) + def callback(result): + name, port = random.choice(sorted((str(x.payload.target), x.payload.port) for x in result[0])) + reactor.connectTCP(name, port, f, **tcpkwargs) def errback(err): f.clientConnectionFailed(None, err) # None?! - d = resolver.getHostByName(config.IRCSERVER, (1, 3, 11)) + d = CONNECTION_RESOLVER.lookupService(config.IRCSERVER, (1, 3, 11)) d.addCallbacks(callback, errback) return f