From 3d26049aebf6d73cd791a44ab73dbf8c371faa0b Mon Sep 17 00:00:00 2001 From: Sadrul Habib Chowdhury Date: Sun, 10 Feb 2008 11:11:04 +0000 Subject: [PATCH] Rearrange almost all of the code. --- deluge/ui/null/deluge_shell.py | 374 +++++++++++++++++++-------------- 1 file changed, 218 insertions(+), 156 deletions(-) diff --git a/deluge/ui/null/deluge_shell.py b/deluge/ui/null/deluge_shell.py index a521d5556..28b645393 100755 --- a/deluge/ui/null/deluge_shell.py +++ b/deluge/ui/null/deluge_shell.py @@ -53,169 +53,232 @@ status_keys = ["state", "file_progress", ] -def add_torrent(cmd): - """Add a torrent.""" - def show_usage(): +class Command: + def __init__(self): + pass + + def execute(self, cmd): + pass + + def usage(self): + print "" + + def help(self): + pass + +class CommandAdd(Command): + """Command to add a torrent.""" + def execute(self, cmd): + if len(cmd) < 2: + self.usage() + return + + save_path = None + readpath = False + if cmd[1] == '-p': + if len(cmd) < 4: + self.usage() + return + del cmd[1] + readpath = True + else: + def _got_config(configs): + global save_path + save_path = configs['download_location'] + client.get_config(_got_config) + client.force_call() + + command = " ".join(cmd[1:]) + paths = command.split(';') + if readpath: + save_path = paths[0].strip() # Perhaps verify that the path exists? + client.set_config({'download_location': save_path}) + del paths[0] + + if not save_path: + print "There's no save-path specified. You must specify a path to save the downloaded files.\n" + return + + for iter in range(0, len(paths)): + paths[iter] = paths[iter].strip() + if len(paths[iter]) == 0: + del paths[iter] + + try: + client.add_torrent_file(paths) + except Exception, msg: + print "*** Error:", str(msg), "\n" + + def usage(self): print "Usage: add [-p ;] ; [; ...]" print " (Note that a ';' must follow a path)" print "" - if len(cmd) < 2: - show_usage() - return + def help(self): + print "Add a torrent" - save_path = None - readpath = False - if cmd[1] == '-p': - if len(cmd) < 4: - show_usage() - return - del cmd[1] - readpath = True - else: - def _got_config(configs): - global save_path - save_path = configs['download_location'] - client.get_config(_got_config) - client.force_call() +class CommandConfig(Command): + def execute(self, cmd): + del cmd[0] + def _on_get_config(config): + for key in config: + if cmd and key not in cmd: continue + print "%s: %s" % (key, config[key]) + print "" + client.get_config(_on_get_config) - command = " ".join(cmd[1:]) - paths = command.split(';') - if readpath: - save_path = paths[0].strip() # Perhaps verify that the path exists? - client.set_config({'download_location': save_path}) - del paths[0] - - if not save_path: - print "There's no save-path specified. You must specify a path to save the downloaded files.\n" - return - - for iter in range(0, len(paths)): - paths[iter] = paths[iter].strip() - if len(paths[iter]) == 0: - del paths[iter] - - try: - client.add_torrent_file(paths) - client.force_call() - except Exception, msg: - print "*** Error:", str(msg), "\n" - - -def show_configs(cmd): - del cmd[0] - def _on_get_config(config): - for key in config: - if cmd and key not in cmd: continue - print "%s: %s" % (key, config[key]) + def usage(self): + print "Usage: config [key1 [key2 ...]]" print "" - client.get_config(_on_get_config) - client.force_call() -def show_state(state): - ts = common.TORRENT_STATE - return ts.keys()[ts.values().index(state)] + def help(self): + print "Show configuration values" -def show_info(torrent, brief): - """Show information about a torrent.""" - def _got_torrent_status(state): - print "*** ID:", torrent - print "*** Name:", state['name'] - print "*** Path:", state['save_path'] - print "*** Completed:", common.fsize(state['total_done']) + "/" + common.fsize(state['total_size']) - print "*** Status:", show_state(state['state']) - if state['state'] in [3, 4, 5, 6]: - print "*** Download Speed:", common.fspeed(state['download_payload_rate']) - print "*** Upload Speed:", common.fspeed(state['upload_payload_rate']) - if state['state'] in [3, 4]: - print "*** ETA:", "%s" % common.ftime(state['eta']) +class CommandExit(Command): + def execute(self, cmd): + print "Thanks" + sys.exit(0) - if brief == False: - print "*** Seeders:", "%s (%s)" % (state['num_seeds'], state['total_seeds']) - print "*** Peers:", "%s (%s)" % (state['num_peers'], state['total_peers']) - print "*** Share Ratio:", "%.1f" % state['ratio'] - print "*** Availability:", "%.1f" % state['distributed_copies'] - print "*** Files:" - for i, file in enumerate(state['files']): - print "\t*", file['path'], "(%s)" % common.fsize(file['size']), "-", "%.1f%% completed" % (state['file_progress'][i] * 100) - print "" - pr = state['file_priorities'] - print pr - if len(pr) == 0: - pr = [1] * len(state['files']) - pr[0] = 2 - print "b", pr - client.set_torrent_file_priorities(torrent, pr) - client.get_torrent_status(_got_torrent_status, torrent, status_keys) + def help(self): + print "Exit from the client." -def info_torrents(cmd): - """Show information about the torrents.""" - torrents = [] - def _got_session_state(tors): - for tor in tors: - torrents.append(tor) - client.get_session_state(_got_session_state) - client.force_call() - for tor in torrents: +class CommandHelp(Command): + def execute(self, cmd): if len(cmd) < 2: - show_info(tor, True) - elif cmd[1] == tor[0:len(cmd[1])]: - show_info(tor, False) - client.force_call() + print "Available commands:" + for cmd in sorted(commands.keys()): + print "\t*", "%s:" % cmd, + command = commands[cmd] + command.help() + else: + for c in cmd[1:]: + if c not in commands: + print "Unknown command:", c + else: + print "*", "%s:" % c, + command = commands[c] + command.help() + command.usage() -def exit(cmd): - """Terminate.""" - print "Thanks." - sys.exit(0) - -def show_help(cmd): - """Show help.""" - print "Available commands:" - for cmd, action, help in commands: - print "\t" + cmd + ": " + help - -def pause_torrent(cmd): - """Pause a torrent""" - if len(cmd) < 2: - print "Usage: pause [ ...]" - return - try: - client.pause_torrent(cmd[1:]) - except Exception, msg: - print "Error:", str(msg), "\n" - -def resume_torrent(cmd): - """Resume a torrent.""" - if len(cmd) < 2: - print "Usage: resume [ ...]" - return - try: - client.resume_torrent(cmd[1:]) - except Exception, msg: - print "Error:", str(msg), "\n" - -def remove_torrent(cmd): - """Remove a torrent.""" - if len(cmd) < 2: - print "Usage: rm [ ...]" - print " Use 'list' to see the list of torrents." + def usage(self): + print "Usage: help [cmd1 [cmd2 ...]]" print "" - return - try: - client.remove_torrent(cmd[1:]) - except Exception, msg: - print "*** Error:", str(msg), "\n" -commands = (('add', add_torrent, 'Add a torrent'), - ('configs', show_configs, 'Show configurations'), - ('exit', exit, 'Terminate'), - ('help', show_help, 'Show help about a command, or generic help'), - ('info', info_torrents, 'Show information about the torrents'), - ('pause', pause_torrent, 'Pause a torrent.'), - ('quit', exit, 'Terminate'), - ('resume', resume_torrent, 'Resume a torrent.'), - ('rm', remove_torrent, 'Remove a torrent'), -) + def help(self): + print "Show help" + +class CommandInfo(Command): + def execute(self, cmd): + torrents = [] + def _got_session_state(tors): + for tor in tors: + torrents.append(tor) + client.get_session_state(_got_session_state) + client.force_call() + for tor in torrents: + if len(cmd) < 2: + self.show_info(tor, True) + elif cmd[1] == tor[0:len(cmd[1])]: + self.show_info(tor, False) + + def usage(self): + print "Usage: info [ [ ...]]" + print " You can give the first few characters of a torrent-id to identify the torrent." + print "" + + def help(self): + print "Show information about the torrents" + + def show_info(self, torrent, brief): + def show_state(state): + ts = common.TORRENT_STATE + return ts.keys()[ts.values().index(state)] + def _got_torrent_status(state): + print "*** ID:", torrent + print "*** Name:", state['name'] + print "*** Path:", state['save_path'] + print "*** Completed:", common.fsize(state['total_done']) + "/" + common.fsize(state['total_size']) + print "*** Status:", show_state(state['state']) + if state['state'] in [3, 4, 5, 6]: + print "*** Download Speed:", common.fspeed(state['download_payload_rate']) + print "*** Upload Speed:", common.fspeed(state['upload_payload_rate']) + if state['state'] in [3, 4]: + print "*** ETA:", "%s" % common.ftime(state['eta']) + + if brief == False: + print "*** Seeders:", "%s (%s)" % (state['num_seeds'], state['total_seeds']) + print "*** Peers:", "%s (%s)" % (state['num_peers'], state['total_peers']) + print "*** Share Ratio:", "%.1f" % state['ratio'] + print "*** Availability:", "%.1f" % state['distributed_copies'] + print "*** Files:" + for i, file in enumerate(state['files']): + print "\t*", file['path'], "(%s)" % common.fsize(file['size']), "-", "%.1f%% completed" % (state['file_progress'][i] * 100) + print "" + client.get_torrent_status(_got_torrent_status, torrent, status_keys) + +class CommandPause(Command): + def execute(self, cmd): + if len(cmd) < 2: + self.usage() + return + try: + client.pause_torrent(cmd[1:]) + except Exception, msg: + print "Error:", str(msg), "\n" + + def usage(self): + print "Usage: pause [ ...]" + print "" + + def help(self): + print "Pause a torrent" + +class CommandResume(Command): + def execute(self, cmd): + if len(cmd) < 2: + self.usage() + return + try: + client.resume_torrent(cmd[1:]) + except Exception, msg: + print "Error:", str(msg), "\n" + + def usage(self): + print "Usage: resume [ ...]" + print "" + + def help(self): + print "Resume a torrent" + +class CommandRemove(Command): + def execute(self, cmd): + if len(cmd) < 2: + self.usage() + return + try: + client.remove_torrent(cmd[1:]) + except Exception, msg: + print "*** Error:", str(msg), "\n" + + def usage(self): + print "Usage: rm [ ...]" + print "" + + def help(self): + print "Remove a torrent" + +commands = { + 'add' : CommandAdd(), + 'configs' : CommandConfig(), + 'exit' : CommandExit(), + 'help' : CommandHelp(), + 'info' : CommandInfo(), + 'pause' : CommandPause(), + 'quit' : CommandExit(), + 'resume' : CommandResume(), + 'rm' : CommandRemove(), + 'del' : CommandRemove(), +} client.set_core_uri("http://localhost:58846") @@ -224,6 +287,7 @@ class NullUI: print "Welcome to deluge-shell. Type 'help' to see a list of available commands." readline.read_init_file() + while True: inp = raw_input("> ") if len(inp) == 0: break @@ -232,14 +296,12 @@ class NullUI: print "" cmd = inp[0] found = False - for command, action, help in commands: - if command != cmd: - continue - action(inp) - found = True - break - if not found: + if cmd not in commands: print "Invalid command!" - show_help([]) + commands['help'].execute([]) + else: + command = commands[cmd] + command.execute(inp) + client.force_call() print "Thanks."