¿Enviando datos de un protocolo a otro protocolo en Twisted?

Uno de mis protocolos está conectado a un servidor, y con la salida de eso me gustaría enviarlo al otro protocolo.

Necesito acceder al método ‘msg’ en ClassA desde ClassB pero sigo recibiendo: exceptions.AttributeError: 'NoneType' object has no attribute 'write'

Código actual:

 from twisted.words.protocols import irc from twisted.internet import protocol from twisted.internet.protocol import Protocol, ClientFactory from twisted.internet import reactor IRC_USERNAME = 'xxx' IRC_CHANNEL = '#xxx' T_USERNAME = 'xxx' T_PASSWORD = md5.new('xxx').hexdigest() class ircBot(irc.IRCClient): def _get_nickname(self): return self.factory.nickname nickname = property(_get_nickname) def signedOn(self): self.join(self.factory.channel) print "Signed on as %s." % (self.nickname,) def joined(self, channel): print "Joined %s." % (channel,) def privmsg(self, user, channel, msg): if not user: return who = "%s: " % (user.split('!', 1)[0], ) print "%s %s" % (who, msg) class ircBotFactory(protocol.ClientFactory): protocol = ircBot def __init__(self, channel, nickname=IRC_USERNAME): self.channel = channel self.nickname = nickname def clientConnectionLost(self, connector, reason): print "Lost connection (%s), reconnecting." % (reason,) connector.connect() def clientConnectionFailed(self, connector, reason): print "Could not connect: %s" % (reason,) class SomeTClass(Protocol): def dataReceived(self, data): if data.startswith('SAY'): data = data.split(';', 1) # RAGE #return self.ircClient.msg(IRC_CHANNEL, 'test') def connectionMade(self): self.transport.write("mlogin %s %s\n" % (T_USERNAME, T_PASSWORD)) class tClientFactory(ClientFactory): def startedConnecting(self, connector): print 'Started to connect.' def buildProtocol(self, addr): print 'Connected.' return t() def clientConnectionLost(self, connector, reason): print 'Lost connection. Reason:', reason def clientConnectionFailed(self, connector, reason): print 'Connection failed. Reason:', reason if __name__ == "__main__": #chan = sys.argv[1] reactor.connectTCP('xxx', 6667, ircBotFactory(IRC_CHANNEL) ) reactor.connectTCP('xxx', 20184, tClientFactory() ) reactor.run() 

¿Alguna idea por favor? 🙂

Preguntas frecuentes torcidas:

¿Cómo hago entrada en un resultado de conexión en salida en otra?

Esto parece que es una pregunta retorcida, pero en realidad es una pregunta de Python. Cada objeto de protocolo representa una conexión; puede llamar a su transport.write para escribir algunos datos en él. Estos son objetos regulares de Python; puede ponerlos en listas, diccionarios o cualquier otra estructura de datos que sea apropiada para su aplicación.

Como ejemplo simple, agregue una lista a su fábrica y, en el protocolo, conexión y desconexión de su protocolo, agréguela y elimínela de esa lista. Aquí está el código de Python:

 from twisted.internet.protocol import Protocol, Factory from twisted.internet import reactor class MultiEcho(Protocol): def connectionMade(self): self.factory.echoers.append(self) def dataReceived(self, data): for echoer in self.factory.echoers: echoer.transport.write(data) def connectionLost(self, reason): self.factory.echoers.remove(self) class MultiEchoFactory(Factory): protocol = MultiEcho def __init__(self): self.echoers = [] reactor.listenTCP(4321, MultiEchoFactory()) reactor.run()