big refactoring of the interface
[electrum-nvc.git] / electrum
index 314d25e..4e842f4 100755 (executable)
--- a/electrum
+++ b/electrum
@@ -36,9 +36,9 @@ except ImportError:
     sys.exit("Error: AES does not seem to be installed. Try 'sudo pip install slowaes'")
 
 try:
-    from lib import Wallet, WalletSynchronizer, format_satoshis, mnemonic, prompt_password, SimpleConfig, pick_random_server
+    from lib import Wallet, Interface, WalletSynchronizer, WalletVerifier, format_satoshis, mnemonic, SimpleConfig, pick_random_server
 except ImportError:
-    from electrum import Wallet, WalletSynchronizer, format_satoshis, mnemonic, prompt_password, SimpleConfig, pick_random_server
+    from electrum import Wallet, Interface, WalletSynchronizer, WalletVerifier, format_satoshis, mnemonic, SimpleConfig, pick_random_server
 
 from decimal import Decimal
 
@@ -82,6 +82,8 @@ options:\n  --fee, -f: set transaction fee\n  --fromaddr, -s: send from address
              'Verifies a signature\nSyntax: verifymessage <address> <signature> <message>\nIf you want to lead or end a message with spaces, or want double spaces inside the message make sure you quote the string. I.e. " Hello  This is a weird String "',
     'eval':  
              "Run python eval() on an object\nSyntax: eval <expression>\nExample: eval \"wallet.aliases\"",
+    'set': 
+             "Set wallet parameter. (gui)",
     'deseed':
             "Remove seed from the wallet. The seed is stored in a file that has the name of the wallet plus '.seed'",
     'reseed':
@@ -98,7 +100,7 @@ offline_commands = [ 'password', 'mktx',
                      'label', 'contacts',
                      'help', 'validateaddress',
                      'signmessage', 'verifymessage',
-                     'eval', 'create', 'addresses',
+                     'eval', 'set', 'create', 'addresses',
                      'import', 'seed',
                      'deseed','reseed',
                      'freeze','unfreeze',
@@ -107,11 +109,28 @@ offline_commands = [ 'password', 'mktx',
 
 protected_commands = ['payto', 'password', 'mktx', 'seed', 'import','signmessage' ]
 
+# get password routine
+def prompt_password(prompt, confirm=True):
+    import getpass
+    if sys.stdin.isatty():
+        password = getpass.getpass(prompt)
+        if password and confirm:
+            password2 = getpass.getpass("Confirm: ")
+            if password != password2:
+                sys.exit("Error: Passwords do not match.")
+    else:
+        password = raw_input(prompt)
+    if not password:
+        password = None
+    return password
+
+
+
 if __name__ == '__main__':
 
     usage = "usage: %prog [options] command\nCommands: "+ (', '.join(known_commands))
     parser = optparse.OptionParser(prog=usage)
-    parser.add_option("-g", "--gui", dest="gui", help="gui")
+    parser.add_option("-g", "--gui", dest="gui", help="User interface: qt, lite, gtk or text")
     parser.add_option("-w", "--wallet", dest="wallet_path", help="wallet path (default: electrum.dat)")
     parser.add_option("-o", "--offline", action="store_true", dest="offline", default=False, help="remain offline")
     parser.add_option("-a", "--all", action="store_true", dest="show_all", default=False, help="show all addresses")
@@ -141,13 +160,13 @@ if __name__ == '__main__':
     #this entire if/else block is just concerned with importing the 
     #right GUI toolkit based the GUI command line option given 
     if cmd == 'gui':
-        pref_gui = config.get('gui','qt')
+        pref_gui = config.get('gui','classic')
         if pref_gui == 'gtk':
             try:
                 import lib.gui as gui
             except ImportError:
                 import electrum.gui as gui
-        elif pref_gui == 'qt':
+        elif pref_gui in ['classic', 'qt']:
             try:
                 import lib.gui_qt as gui
             except ImportError:
@@ -157,12 +176,20 @@ if __name__ == '__main__':
                   import lib.gui_lite as gui
               except ImportError:
                   import electrum.gui_lite as gui
+        elif pref_gui == 'text':
+              try:
+                  import lib.gui_text as gui
+              except ImportError:
+                  import electrum.gui_text as gui
         else:
             sys.exit("Error: Unknown GUI: " + pref_gui )
 
         gui = gui.ElectrumGui(wallet, config)
-        interface = WalletSynchronizer(wallet, config, True, gui.server_list_changed)
-        interface.start()
+        wallet.interface = Interface(config, True, gui.server_list_changed)
+        wallet.interface.start()
+
+        WalletSynchronizer(wallet, config).start()
+        WalletVerifier(wallet, config).start()
 
         try:
             found = config.wallet_file_exists
@@ -401,6 +428,14 @@ if __name__ == '__main__':
         print eval(args[1])
         wallet.save()
 
+    elif cmd == 'set':
+        key, value = args[1:3]
+        if key in ['gui', 'server', 'proxy', 'fee', 'gap_limit', 'use_change']:
+            wallet.config.set_key(key, value, True)
+            print True
+        else:
+            print False
+
     elif cmd in [ 'addresses']:
         for addr in wallet.all_addresses():
             if options.show_all or not wallet.is_change(addr):
@@ -540,17 +575,17 @@ if __name__ == '__main__':
 
     elif cmd == 'freeze':
         addr = args[1]
-        print self.wallet.freeze(addr)
+        print wallet.freeze(addr)
         
     elif cmd == 'unfreeze':
         addr = args[1]
-        print self.wallet.unfreeze(addr)
+        print wallet.unfreeze(addr)
 
     elif cmd == 'prioritize':
         addr = args[1]
-        print self.wallet.prioritize(addr)
+        print wallet.prioritize(addr)
 
     elif cmd == 'unprioritize':
         addr = args[1]
-        print self.wallet.unprioritize(addr)
+        print wallet.unprioritize(addr)