package polly.rx.commands; import java.util.List; import polly.rx.MSG; import polly.rx.core.orion.Orion; import polly.rx.core.orion.QuadrantUtils; import polly.rx.core.orion.http.OrionController; import polly.rx.core.orion.model.Sector; import polly.rx.core.orion.model.Wormhole; import polly.rx.core.orion.pathplanning.PathPlanner; import polly.rx.core.orion.pathplanning.PathPlanner.UniversePath; import polly.rx.core.orion.pathplanning.RouteOptions; import polly.rx.parsing.ParseException; import de.skuzzle.polly.sdk.DelayedCommand; import de.skuzzle.polly.sdk.MyPolly; import de.skuzzle.polly.sdk.Parameter; import de.skuzzle.polly.sdk.Signature; import de.skuzzle.polly.sdk.Types; import de.skuzzle.polly.sdk.Types.TimespanType; import de.skuzzle.polly.sdk.User; import de.skuzzle.polly.sdk.exceptions.CommandException; import de.skuzzle.polly.sdk.exceptions.DuplicatedSignatureException; import de.skuzzle.polly.sdk.exceptions.InsufficientRightsException; import de.skuzzle.polly.sdk.time.Milliseconds; public class RouteCommand extends DelayedCommand { public RouteCommand(MyPolly polly) throws DuplicatedSignatureException { super(polly, "route", (int) Milliseconds.fromSeconds(10)); //$NON-NLS-1$ this.createSignature(MSG.routeSig0Desc, OrionController.ROUTE_ORION_PREMISSION, new Parameter(MSG.routeSig0Start, Types.STRING), new Parameter(MSG.routeSig0Ziel, Types.STRING)); this.setHelpText(MSG.routeHelp); } @Override protected boolean executeOnBoth(User executer, String channel, Signature signature) throws CommandException, InsufficientRightsException { try { if (this.match(signature, 0)) { final String s = signature.getStringValue(0); final String t = signature.getStringValue(1); final Sector start = QuadrantUtils.parse(s); final Sector target = QuadrantUtils.parse(t); final PathPlanner planner = Orion.INSTANCE.getPathPlanner(); final List<Sector> personalPortals = Orion.INSTANCE.getPersonalPortals(executer); final RouteOptions options = new RouteOptions(new TimespanType(0), new TimespanType(0), personalPortals, false, false, false); final UniversePath path = planner.findShortestPath(start, target, options); this.outputPath(channel, path); } } catch (ParseException e) { throw new CommandException(e.getMessage(), e); } return super.executeOnBoth(executer, channel, signature); } private void outputPath(String channel, UniversePath path) { if (!path.pathFound()) { this.reply(channel, MSG.routeNoRouteFound); return; } for (final Wormhole hole : path.getWormholes()) { final String s = String.format("von: %s %d,%d nach: %s %d,%d. Entladung: %d-%d. Triebwerke: %s", //$NON-NLS-1$ hole.getSource().getQuadName(), hole.getSource().getX(), hole.getSource().getY(), hole.getTarget().getQuadName(), hole.getTarget().getX(), hole.getTarget().getY(), hole.getMinUnload(), hole.getMaxUnload(), hole.requiresLoad()); this.reply(channel, s); } this.reply(channel, MSG.bind(MSG.routeInfo, path.getSectorJumps(), path.getQuadJumps())); } }