diff --git a/src/main/java/com/epita/creeps/AsyncExec.java b/src/main/java/com/epita/creeps/AsyncExec.java index 7d63bc8..7a5034f 100644 --- a/src/main/java/com/epita/creeps/AsyncExec.java +++ b/src/main/java/com/epita/creeps/AsyncExec.java @@ -11,20 +11,26 @@ import java.net.http.HttpResponse; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; +import java.util.function.Function; import java.util.function.Supplier; // Handles server operations to respect commands delays -@AllArgsConstructor -public class AsyncExec { +@NoArgsConstructor +public class AsyncExec { @Getter @Setter private static long ticksPerSecond = 1; + private CompletableFuture task; + public static CompletableFuture asyncExec(Supplier supplier, long time) { return CompletableFuture.supplyAsync(supplier).thenApplyAsync(x -> x, CompletableFuture.delayedExecutor(time/ticksPerSecond + 1, TimeUnit.SECONDS)); } + public static CompletableFuture thenAsyncExec(CompletableFuture base, Function f, long time) { + return base.thenApplyAsync(f, CompletableFuture.delayedExecutor(time/ticksPerSecond + 1, TimeUnit.SECONDS)); + } public static void justWait(long time) { CompletableFuture.supplyAsync(() -> 0, CompletableFuture.delayedExecutor(time/ticksPerSecond + 1, TimeUnit.SECONDS)).join(); } diff --git a/src/main/java/com/epita/creeps/Program.java b/src/main/java/com/epita/creeps/Program.java index 4fe48fd..8fee7f0 100644 --- a/src/main/java/com/epita/creeps/Program.java +++ b/src/main/java/com/epita/creeps/Program.java @@ -1,10 +1,10 @@ package com.epita.creeps; import com.epita.creeps.commands.Basics; -import com.epita.creeps.given.json.Json; import com.epita.creeps.given.vo.geometry.Direction; import com.epita.creeps.given.vo.response.CommandResponse; import com.epita.creeps.given.vo.response.InitResponse; +import com.epita.creeps.units.Citizen; import kong.unirest.core.HttpResponse; import kong.unirest.core.JsonNode; import kong.unirest.core.Unirest; @@ -12,9 +12,6 @@ import kong.unirest.core.UnirestException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; - public class Program { private static String srvUrl; diff --git a/src/main/java/com/epita/creeps/Citizen.java b/src/main/java/com/epita/creeps/units/Citizen.java similarity index 55% rename from src/main/java/com/epita/creeps/Citizen.java rename to src/main/java/com/epita/creeps/units/Citizen.java index 65aaf31..9dbf319 100644 --- a/src/main/java/com/epita/creeps/Citizen.java +++ b/src/main/java/com/epita/creeps/units/Citizen.java @@ -1,5 +1,6 @@ -package com.epita.creeps; +package com.epita.creeps.units; +import com.epita.creeps.AsyncExec; import com.epita.creeps.given.json.Json; import com.epita.creeps.given.vo.geometry.Direction; import com.epita.creeps.given.vo.response.CommandResponse; @@ -7,27 +8,16 @@ import kong.unirest.core.HttpResponse; import kong.unirest.core.JsonNode; import kong.unirest.core.Unirest; -import java.util.concurrent.CompletableFuture; -//import java.util.logging.Logger; -import org.slf4j.Logger; -public class Citizen { - private final String id; - private final String command_uri; - private CompletableFuture> pendingAction; - public static String srvUrl; - public static Logger logger; +public class Citizen extends Unit { public Citizen(String login, String citizen_id ) { - if (srvUrl == null || logger == null) { - throw new RuntimeException("Tried to create a citizen without properly initializing static fields"); - } - id = citizen_id; - command_uri = srvUrl + "/command/" + login + "/" + citizen_id + "/"; + super(login, citizen_id); } public void move(Direction direction) { - pendingAction = AsyncExec.asyncExec(() -> Unirest.post(command_uri + "move:"+direction.direction).asJson(), 2); + pendingAction = AsyncExec.asyncExec(() -> Unirest.post(command_uri + "move:"+direction.direction).asJson(), 2) + .thenApplyAsync( x -> x ); } public CommandResponse waitFinished() { diff --git a/src/main/java/com/epita/creeps/units/Unit.java b/src/main/java/com/epita/creeps/units/Unit.java new file mode 100644 index 0000000..b163567 --- /dev/null +++ b/src/main/java/com/epita/creeps/units/Unit.java @@ -0,0 +1,23 @@ +package com.epita.creeps.units; + +import kong.unirest.core.HttpResponse; +import kong.unirest.core.JsonNode; +import org.slf4j.Logger; + +import java.util.concurrent.CompletableFuture; + +public abstract class Unit { + protected final String id; + protected final String command_uri; + protected CompletableFuture> pendingAction; + public static String srvUrl; + public static Logger logger; + + public Unit(String login, String id) { + if (srvUrl == null || logger == null) { + throw new RuntimeException("Tried to create a citizen without properly initializing static fields"); + } + this.id = id; + command_uri = srvUrl + "/command/" + login + "/" + id + "/"; + } +}