[Twisted-Python] How to cycle through servers on Connection Fail in an IRC client?

inhahe inhahe at gmail.com
Fri Feb 26 00:45:05 MST 2021


I'm making an IRC client  using Twisted, and I want to connect to a
different server when connection fails, but I haven't been able to figure
out how to do that..

Here's a more or less minimal code sample reflecting what I have now:

------------------------------------------------------------------------------------------------

from twisted.words.protocols import irc
from twisted.internet import protocol
from twisted.internet import reactor

class ServerConnection(irc.IRCClient):

  def __init__(self):
    self.signedon = False
    self.nickindex = 0

  def signedOn(self):
    print("signed on")

  def nickChanged(self, newnick):
    self.nickname = newnick

class Network(object):
  def __init__(self, servers, mynick=None):
    self.servers = servers
    self.mynick = mynick
    self.serverindex = 0

class ServerFactory(protocol.ReconnectingClientFactory):
  def __init__(self, nickname="qttwirc", password=None, username="qttwirc",
realname=None, network=None):
    self.network = network
    self.network.mynick = nickname
    self.nickname = nickname
    self.username = username
    self.password = password
    self.realname = realname
    protocol.ReconnectingClientFactory.initialDelay = 10 #should i leave
this at 1?
    protocol.ReconnectingClientFactory.maxDelay = 10 #no idea what value
this should be. 3.5 wasn't slow enough, i was being throttled.

  def buildProtocol(self, addr):
    p = ServerConnection()
    self.serverconnection = p
    p.server = self
    p.nickname = self.nickname
    p.username = self.username
    self.resetDelay()
    return p

  def clientConnectionLost(self, connector, reason):
    self.serverconnection = None
    protocol.ReconnectingClientFactory.clientConnectionLost(self,
connector, reason)

  def clientConnectionFailed(self, connector, reason):
    self.serverconnection = None
    addr, port = self.network.servers[self.network.serverindex]
    self.network.serverindex = (self.network.serverindex+1) %
len(self.network.servers) #todo: make it actually use these values

    #reactor.callLater(config.reconnectdelay, reactor.connectTCP,
addr.encode("ascii"), port, self)
    #reactor.connectTCP(addr, port, self) #is this feasible? i don't know a
better way to do this. connector.connect() apparently doesn't take
server/port as arguments.

    protocol.ReconnectingClientFactory.clientConnectionFailed(self,
connector, reason)

network = Network([("hitchcock.freenode.net", 6667), ("verne.freenode.net",
6667)])
server = ServerFactory(nickname="test123", username="test123",
network=network)
reactor.connectTCP(*network.servers[network.serverindex], server)
reactor.run()

------------------------------------------------------------------------------------------------

If I have to completely change the structure of how I connect, that's
fine.. I don't understand Twisted very well, so I'm not aware of what some
other options are for how to make an IRC client.

(It probably doesn't matter, but in my actual program I'm using both
Twisted and PyQt5 in the same run loop using qt5reactor..)

Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20210226/44ab753d/attachment.htm>


More information about the Twisted-Python mailing list