/* * Written and copyright 2001-2004 Tobias Minich. Distributed under the GNU * General Public License; see the README file. This code comes with NO * WARRANTY. * * Hack.java * * Created on 22.03.2004 * */ package org.gudy.azureus2.ui.console.commands; import java.io.PrintStream; import java.net.URI; import java.net.URL; import java.util.Iterator; import java.util.List; import org.gudy.azureus2.core3.disk.DiskManager; import org.gudy.azureus2.core3.disk.DiskManagerFileInfo; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer; import org.gudy.azureus2.ui.console.ConsoleInput; /** * @author Tobias Minich */ public class Hack extends TorrentCommand { private final CommandCollection subCommands = new CommandCollection(); public Hack() { super("hack", "#", "Hacking"); subCommands.add(new HackFile()); subCommands.add(new HackTracker()); subCommands.add(new HackDownloadSpeed()); subCommands.add(new HackUploadSpeed()); subCommands.add(new HackUploads()); } public String getCommandDescriptions() { return "hack [<various options>]\t#\tModify torrent settings. Use without parameters for further help."; } public void printHelpExtra(PrintStream out, List args) { out.println("> -----"); out.println("'hack' syntax:"); if( args.size() > 0 ) { String command = (String) args.remove(0); IConsoleCommand cmd = subCommands.get(command); if( cmd != null ) cmd.printHelp(out, args); return; } out.println("hack <torrent id> <command> <command options>"); out.println(); out.println("<torrent id> can be one of the following:"); out.println("<#>\t\tNumber of a torrent. You have to use 'show torrents' first as the number is taken from there."); out.println("hash <hash>\tApplied to torrent with the hash <hash> as given in the xml output or extended torrent info ('show <#>')."); out.println("help\t\tDetailed help for <command>"); out.println(); out.println("Available <command>s:"); for (Iterator iter = subCommands.iterator(); iter.hasNext();) { TorrentSubCommand cmd = (TorrentSubCommand) iter.next(); out.println(cmd.getCommandDescriptions()); } out.println("> -----"); } /** * finds the appropriate subcommand and executes it. * the execute() method will have taken care of finding/iterating over the * appropriate torrents */ protected boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Not enough parameters for command '" + getCommandName() + "'."); return false; } String subCommandName = (String)args.remove(0); TorrentSubCommand cmd = (TorrentSubCommand) subCommands.get(subCommandName); if( cmd != null ) return cmd.performCommand(ci, dm, args); else { ci.out.println("> Command 'hack': Command parameter '" + subCommandName + "' unknown."); return false; } } private static class HackDownloadSpeed extends TorrentSubCommand { public HackDownloadSpeed() { super("downloadspeed", "d"); } public String getCommandDescriptions() { return "downloadspeed\td\tSet max download speed [in kbps]of a torrent (0 for unlimited)."; } /** * locate the appropriate subcommand and execute it */ public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand '" + getCommandName() + "'"); return false; } int newSpeed = Math.max(-1, Integer.parseInt((String) args.get(0))); dm.getStats().setDownloadRateLimitBytesPerSecond(newSpeed*1024); return true; } } private static class HackUploadSpeed extends TorrentSubCommand { public HackUploadSpeed() { super("uploadspeed", "u"); } public String getCommandDescriptions() { return "uploadspeed\tu\tSet max upload speed [in kbps] of a torrent (0 for unlimited)."; } /** * locate the appropriate subcommand and execute it */ public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand '" + getCommandName() + "'"); return false; } int newSpeed = Math.max(-1, Integer.parseInt((String) args.get(0))); dm.getStats().setUploadRateLimitBytesPerSecond(newSpeed*1024); return true; } } private static class HackUploads extends TorrentSubCommand { public HackUploads() { super("uploads", "v"); } public String getCommandDescriptions() { return "uploads\tv\tSet max upload slots of a torrent."; } /** * locate the appropriate subcommand and execute it */ public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand '" + getCommandName() + "'"); return false; } int newSlots = Math.max(-1, Integer.parseInt((String) args.get(0))); dm.setMaxUploads(newSlots); return true; } } private static class HackTracker extends TorrentSubCommand { private final CommandCollection subCommands = new CommandCollection(); public HackTracker() { super("tracker", "t"); subCommands.add(new HackHost()); subCommands.add(new HackPort()); subCommands.add(new HackURL()); } public void printHelpExtra(PrintStream out, List args) { out.println("hack <torrent id> tracker [command] <new value>"); out.println(); out.println("[command] can be one of the following:"); for (Iterator iter = subCommands.iterator(); iter.hasNext();) { TorrentSubCommand cmd = (TorrentSubCommand) iter.next(); out.println(cmd.getCommandDescriptions()); } out.println(); out.println("You can also omit [command] and only give a new full URL (just like the [command] 'url')."); out.println("> -----"); } /** * locate the appropriate subcommand and execute it */ public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand '" + getCommandName() + "'"); return false; } String trackercommand = (String) args.remove(0); TRTrackerAnnouncer client = dm.getTrackerClient(); //ci.out.println("> Command 'hack': Debug: '"+trackercommand+"'"); if (client == null) { ci.out.println("> Command 'hack': Tracker interface not available."); return false; } TorrentSubCommand cmd = (TorrentSubCommand) subCommands.get(trackercommand); if( cmd == null ) { args.add(trackercommand); cmd = (TorrentSubCommand) subCommands.get("url"); } return cmd.performCommand(ci, dm, args); } public String getCommandDescriptions() { return "tracker\t\tt\tModify Tracker URL of a torrent."; } } private static class HackFile extends TorrentSubCommand { public HackFile() { super("file", "f"); } public void printHelpExtra(PrintStream out, List args) { out.println("hack <torrent id> file <#> <priority>"); out.println(); out.println("<#> Number of the file."); out.println(); out.println("<priority> can be one of the following:"); out.println("normal\t\tn\tNormal Priority"); out.println("high\t\th|+\tHigh Priority"); out.println("nodownload\t!|-\tDon't download this file."); out.println("> -----"); } public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.size() < 2) { ci.out.println("> Command 'hack': Not enough parameters for subcommand 'file'."); return false; } try { DiskManager disk = dm.getDiskManager(); DiskManagerFileInfo files[] = disk.getFiles(); int file = Integer.parseInt((String) args.get(0)); String c = (String) args.get(1); if (c.equalsIgnoreCase("normal") || c.equalsIgnoreCase("n")) { files[file - 1].setSkipped(false); files[file - 1].setPriority(0); ci.out.println("> Set file '"+files[file - 1].getFile(true).getName()+"' to normal priority."); } else if (c.equalsIgnoreCase("high") || c.equalsIgnoreCase("h") || c.equalsIgnoreCase("+")) { files[file - 1].setSkipped(false); files[file - 1].setPriority(1); ci.out.println("> Set file '"+files[file - 1].getFile(true).getName()+"' to high priority."); } else if (c.equalsIgnoreCase("nodownload") || c.equalsIgnoreCase("!") || c.equalsIgnoreCase("-")) { files[file - 1].setSkipped(true); files[file - 1].setPriority(0); ci.out.println("> Stopped to download file '"+files[file - 1].getFile(true).getName()+"'."); } else { ci.out.println("> Command 'hack': Unknown priority '" + c + "' for command parameter 'file'."); return false; } return true; } catch (Exception e) { ci.out.println("> Command 'hack': Exception while executing subcommand 'file': " + e.getMessage()); return false; } } public String getCommandDescriptions() { return "file\t\tf\tModify priority of a single file of a batch torrent."; } } private static class HackPort extends TorrentSubCommand { public HackPort() { super("port", "p"); } public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand parameter 'port'."); return false; } TRTrackerAnnouncer client = dm.getTrackerClient(); try { URI uold = new URI(client.getTrackerURL().toString()); String portStr = (String) args.get(0); URI unew = new URI(uold.getScheme(), uold.getUserInfo(), uold.getHost(), Integer.parseInt(portStr), uold.getPath(), uold.getQuery(), uold.getFragment()); client.setTrackerURL(new URL(unew.toString())); ci.out.println("> Set Tracker URL for '"+dm.getSaveLocation()+"' to '"+unew.toString()+"'"); } catch (Exception e) { ci.out.println("> Command 'hack': Assembling new tracker url failed: "+e.getMessage()); return false; } return true; } public String getCommandDescriptions() { return "port\t\tp\tChange the port."; } } private static class HackHost extends TorrentSubCommand { public HackHost() { super("host", "h"); } public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand parameter 'host'."); return false; } TRTrackerAnnouncer client = dm.getTrackerClient(); try { URI uold = new URI(client.getTrackerURL().toString()); URI unew = new URI(uold.getScheme(), uold.getUserInfo(), (String)args.get(0), uold.getPort(), uold.getPath(), uold.getQuery(), uold.getFragment()); client.setTrackerURL(new URL(unew.toString())); ci.out.println("> Set Tracker URL for '"+dm.getSaveLocation()+"' to '"+unew.toString()+"'"); } catch (Exception e) { ci.out.println("> Command 'hack': Assembling new tracker url failed: "+e.getMessage()); return false; } return true; } public String getCommandDescriptions() { return "host\t\th\tChange the host."; } } private static class HackURL extends TorrentSubCommand { public HackURL() { super("url", "u"); } public boolean performCommand(ConsoleInput ci, DownloadManager dm, List args) { if (args.isEmpty()) { ci.out.println("> Command 'hack': Not enough parameters for subcommand parameter 'url'."); return false; } TRTrackerAnnouncer client = dm.getTrackerClient(); try { String uriStr = (String) args.get(0); URI uri = new URI(uriStr); client.setTrackerURL(new URL(uri.toString())); ci.out.println("> Set Tracker URL for '"+dm.getSaveLocation()+"' to '"+uri+"'"); } catch (Exception e) { ci.out.println("> Command 'hack': Parsing tracker url failed: "+e.getMessage()); return false; } return true; } public String getCommandDescriptions() { return "url\t\tu\tChange the full URL (Note: you have to include the '/announce' part)."; } } }