import sys
import uuid
 
import structlog
import twisted
 
from twisted.internet import protocol, reactor
 
logger = structlog.getLogger()
 
 
class Counter(object):
    i = 0
 
    def inc(self):
        self.i += 1
 
    def __repr__(self):
        return str(self.i)
 
 
class Echo(protocol.Protocol):
    def connectionMade(self):
        self._counter = Counter()
        self._log = logger.new(
            connection_id=str(uuid.uuid4()),
            peer=self.transport.getPeer().host,
            count=self._counter,
        )
 
    def dataReceived(self, data):
        self._counter.inc()
        log = self._log.bind(data=data)
        self.transport.write(data)
        log.msg('echoed data!')
 
 
if __name__ == "__main__":
    structlog.configure(
        processors=[structlog.twisted.EventAdapter()],
        logger_factory=structlog.twisted.LoggerFactory(),
    )
    twisted.python.log.startLogging(sys.stderr)
    reactor.listenTCP(1234, protocol.Factory.forProtocol(Echo))
    reactor.run()