]> jfr.im git - irc/quakenet/qwebirc.git/blobdiff - qwebirc/ircclient.py
add dynamic configuration support
[irc/quakenet/qwebirc.git] / qwebirc / ircclient.py
index 72526692efe59cfd465158433f50d0962f70c331..8e06eaed64799658e78cf3fa9c5b9612e95db2ee 100644 (file)
@@ -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