#!/usr/bin/env python
#
# Connect to a bitcoin node and dump out JSON-format block chain
#

from twisted.internet import reactor
from twisted.internet.defer import Deferred
from BitcoinClient import *

def main():
  import optparse
  parser = optparse.OptionParser(usage="%prog [options]\n"+
                                 "Connects to a running bitcoin node and "+
                                 "prints all or part of the best-block-chain.")
  parser.add_option("--host", dest="host", default="127.0.0.1",
                    help="IP/hostname to connect to (default: %default)")
  parser.add_option("--port", dest="port", default="8333", type="int",
                    help="port to connect to (default: %default)")
  parser.add_option("--testnet", dest="testnet", action="store_true", default=False,
                    help="Speak testnet protocol")
  parser.add_option("--n", dest="n_blocks", type="int", default=99999,
                    help="Dump this many blocks (default: all)")
  parser.add_option("--verbose", dest="verbose", action="store_true", default=False,
                    help="Print all messages sent/received")
  parser.add_option("--version", dest="version", default="0.4.0",
                    help="Version of the protocol to speak")
  (options, args) = parser.parse_args()
  # Convert string like "1.0" or "0.3.24.0" to integer version where 1.0.0.0 == 1000000
  version = sum([ int(j)*(100**(3-i)) for (i,j) in enumerate(options.version.split(".")) ])
  def print_blocks(blocks):
    for b in blocks:
      print b
  def start_dumper(connection):
    d = Deferred()
    d.addCallback(print_blocks)
    d.addCallback(lambda x: reactor.stop() )
    connection.getBlocks(None, options.n_blocks, d)
  def connection_failed(reason):
    print("Connection failed: "+reason)
    reactor.stop()
  d = Deferred()
  d.addCallbacks(start_dumper, connection_failed)
  factory = BitcoinClientFactory(options.testnet, version, d)
  reactor.connectTCP(options.host, options.port, factory)
  reactor.run()if __name__ == '__main__':
    main()