old_contents: from twisted.internet.protocol import ClientFactory, ReconnectingClientFactory
  from heufybot.connection import HeufyBotConnection
  
  
  class HeufyBotFactory(ReconnectingClientFactory):
      protocol = HeufyBotConnection
  
      def __init__(self, bot):
          self.bot = bot
          self.currentlyDisconnecting = []
  
      def buildProtocol(self, addr):
          self.resetDelay()
          return self.protocol(self.bot)
  
      def clientConnectionFailed(self, connector, reason):
          self.bot.log.info("Client connection to {connector.host} failed (Reason: {reason.value}).",
                            connector=connector, reason=reason)
          ReconnectingClientFactory.clientConnectionFailed(self, connector, reason)
  
      def clientConnectionLost(self, connector, reason):
          # Disable modules
          if connector.host in self.bot.moduleHandler.enabledModules:
              for module in self.bot.moduleHandler.enabledModules[connector.host]:
                  self.bot.moduleHandler.disableModule(module, connector.host, True)
  
          del self.bot.servers[connector.host]
  
          # Check whether or not we should reconnect
          if connector.host in self.currentlyDisconnecting:
              self.bot.log.info("Connection to {connector.host} was closed cleanly.", connector=connector)
              ClientFactory.clientConnectionLost(self, connector, reason)
              self.currentlyDisconnecting.remove(connector.host)
              self.bot.countConnections()
          else:
              ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
  
new_contents: from twisted.internet.protocol import ClientFactory, ReconnectingClientFactory
  from heufybot.connection import HeufyBotConnection
  
  
  class HeufyBotFactory(ReconnectingClientFactory):
      protocol = HeufyBotConnection
  
      def __init__(self, bot):
          self.bot = bot
          self.currentlyDisconnecting = []
  
      def buildProtocol(self, addr):
          self.resetDelay()
          return self.protocol(self.bot)
  
      def clientConnectionFailed(self, connector, reason):
          self.bot.log.info("Client connection to {connector.host} failed (Reason: {reason.value}).",
                            connector=connector, reason=reason)
          ReconnectingClientFactory.clientConnectionFailed(self, connector, reason)
  
      def clientConnectionLost(self, connector, reason):
          # Disable modules
          if connector.host in self.bot.moduleHandler.enabledModules:
              for module in self.bot.moduleHandler.enabledModules[connector.host]:
                  self.bot.moduleHandler.disableModule(module, connector.host, True)
  
          self.bot.moduleHandler.runGenericAction("disconnect", connector.host)
          del self.bot.servers[connector.host]
  
          # Check whether or not we should reconnect
          if connector.host in self.currentlyDisconnecting:
              self.bot.log.info("Connection to {connector.host} was closed cleanly.", connector=connector)
              ClientFactory.clientConnectionLost(self, connector, reason)
              self.currentlyDisconnecting.remove(connector.host)
              self.bot.countConnections()
          else:
              ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
  
subject: Add an action for server disconnects