X-Git-Url: https://jfr.im/git/irc/quakenet/qwebirc.git/blobdiff_plain/4616221a15368b6c6628904c2ee2ed923a8825ad..f6c5443af9d64d3b870077256baa96e030b1081f:/qwebirc/ircclient.py diff --git a/qwebirc/ircclient.py b/qwebirc/ircclient.py index 28609a6..efda3d4 100644 --- a/qwebirc/ircclient.py +++ b/qwebirc/ircclient.py @@ -1,13 +1,18 @@ -import twisted, sys, codecs +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 +from twisted.names.client import Resolver +import hmac, time, config, random, qwebirc.config_options as config_options from config import HMACTEMPORAL -if config.WEBIRC_MODE == "hmac": +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) def hmacfn(*args): @@ -41,8 +46,10 @@ class QWebIRCClient(basic.LineReceiver): prefix, command, params = irc.parsemsg(line) self.handleCommand(command, prefix, params) except irc.IRCBadMessage: - self.badMessage(line, *sys.exc_info()) - + # emit and ignore + traceback.print_exc() + return + if command == "001": self.__nickname = params[0] @@ -55,9 +62,6 @@ class QWebIRCClient(basic.LineReceiver): if nick == self.__nickname: self.__nickname = params[0] - def badMessage(self, args): - self("badmessage", args) - def handleCommand(self, command, prefix, params): self("c", command, prefix, params) @@ -72,11 +76,13 @@ class QWebIRCClient(basic.LineReceiver): self.lastError = None f = self.factory.ircinit - nick, ident, ip, realname, hostname = f["nick"], f["ident"], f["ip"], f["realname"], f["hostname"] + nick, ident, ip, realname, hostname, pass_ = f["nick"], f["ident"], f["ip"], f["realname"], f["hostname"], f.get("password") self.__nickname = nick self.__perform = f.get("perform") - if config.WEBIRC_MODE == "hmac": + if not hasattr(config, "WEBIRC_MODE"): + self.write("USER %s bleh bleh %s :%s" % (ident, ip, realname)) + elif config.WEBIRC_MODE == "hmac": hmac = hmacfn(ident, ip) self.write("USER %s bleh bleh %s %s :%s" % (ident, ip, hmac, realname)) elif config.WEBIRC_MODE == "webirc": @@ -85,7 +91,7 @@ class QWebIRCClient(basic.LineReceiver): elif config.WEBIRC_MODE == "cgiirc": self.write("PASS %s_%s_%s" % (config.CGIIRC_STRING, ip, hostname)) self.write("USER %s bleh %s :%s" % (ident, ip, realname)) - else: + elif config.WEBIRC_MODE == config_options.WEBIRC_REALNAME or config.WEBIRC_MODE is None: # last bit is legacy if ip == hostname: dispip = ip else: @@ -93,6 +99,8 @@ class QWebIRCClient(basic.LineReceiver): self.write("USER %s bleh bleh :%s - %s" % (ident, dispip, realname)) + if pass_ is not None: + self.write("PASS :%s" % pass_) self.write("NICK %s" % nick) self.factory.client = self @@ -138,7 +146,18 @@ class QWebIRCFactory(protocol.ClientFactory): def createIRC(*args, **kwargs): f = QWebIRCFactory(*args, **kwargs) - reactor.connectTCP(config.IRCSERVER, config.IRCPORT, f) + if CONNECTION_RESOLVER is None: + reactor.connectTCP(config.IRCSERVER, config.IRCPORT, f) + return 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) + def errback(err): + f.clientConnectionFailed(None, err) # None?! + + d = CONNECTION_RESOLVER.lookupService(config.IRCSERVER, (1, 3, 11)) + d.addCallbacks(callback, errback) return f if __name__ == "__main__":