summaryrefslogtreecommitdiff
path: root/graphs/java/nucBattle
diff options
context:
space:
mode:
Diffstat (limited to 'graphs/java/nucBattle')
-rw-r--r--graphs/java/nucBattle/.gitignore38
-rw-r--r--graphs/java/nucBattle/pom.xml150
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java18
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java101
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java20
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java20
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java18
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java14
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java18
-rw-r--r--graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java30
-rw-r--r--graphs/java/nucBattle/src/main/resources/exampleBattle1.json66
11 files changed, 493 insertions, 0 deletions
diff --git a/graphs/java/nucBattle/.gitignore b/graphs/java/nucBattle/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/graphs/java/nucBattle/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store \ No newline at end of file
diff --git a/graphs/java/nucBattle/pom.xml b/graphs/java/nucBattle/pom.xml
new file mode 100644
index 0000000..2ce959c
--- /dev/null
+++ b/graphs/java/nucBattle/pom.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>fr.epita.assistants</groupId>
+ <artifactId>nucBattle</artifactId>
+ <version>1.0</version>
+
+ <properties>
+ <versions.java>21</versions.java>
+ <versions.junit>5.9.1</versions.junit>
+ <versions.maven-compiler-plugin>3.13.0</versions.maven-compiler-plugin>
+ <versions.maven-surefire-plugin>3.5.0</versions.maven-surefire-plugin>
+ <versions.maven-jar-plugin>3.1.1</versions.maven-jar-plugin>
+ <versions.maven-install-plugin>3.1.0</versions.maven-install-plugin>
+
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+ <surefire.reportsDirectory>${project.build.directory}/surefire-reports</surefire.reportsDirectory>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <version>1.18.30</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter</artifactId>
+ <version>${versions.junit}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.18.0</version>
+ </dependency>
+ <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.18.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.surefire</groupId>
+ <artifactId>surefire-junit-platform</artifactId>
+ <version>${versions.maven-surefire-plugin}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-compat</artifactId>
+ <version>3.9.8</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>3.9.8</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-project</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-core</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-monitor</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>3.0.24</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-filtering</artifactId>
+ <version>3.3.2</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-interpolation</artifactId>
+ <version>1.13</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-profile</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-artifact-manager</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-registry</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-repository-metadata</artifactId>
+ <version>2.2.1</version>
+ </dependency>
+ <dependency>
+ <groupId>classworlds</groupId>
+ <artifactId>classworlds</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-commons</artifactId>
+ <version>1.9.3</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>${versions.maven-compiler-plugin}</version>
+ <configuration>
+ <source>${versions.java}</source>
+ <target>${versions.java}</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>${versions.maven-install-plugin}</version>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${versions.maven-surefire-plugin}</version>
+ <configuration>
+ <reportsDirectory>${surefire.reportsDirectory}</reportsDirectory>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java
new file mode 100644
index 0000000..35a9b3e
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Battle.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Battle {
+ @JsonProperty("battle_id")
+ private int battleId;
+
+ private List<Turn> turns;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java
new file mode 100644
index 0000000..57d7dcc
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/BattleManager.java
@@ -0,0 +1,101 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+public class BattleManager {
+ String input;
+ private Map<String, Nuc> nucs;
+ private Battle battle;
+
+ public BattleManager(String input) {
+ this.input = input;
+ }
+
+ public void computeBattle(String reportPath) {
+ Report report = new Report();
+ try (Stream<String> stream = Files.lines(Paths.get(input))) {
+ String jsonString = stream.reduce("", (s1, s2) -> s1 + s2);
+ ObjectMapper om = new ObjectMapper();
+ JsonNode jn = om.readTree(jsonString);
+ if (jn == null || jn.isNull()) {
+ report.setType(ReportType.ERROR);
+ exportReport(reportPath, report);
+ }
+ nucs = om.readValue(jn.get("NUCs").toString(), new TypeReference<Map<String, Nuc>>() {
+ });
+
+ SimpleModule mod = new SimpleModule();
+ mod.addDeserializer(Turn.class, new TurnDeserializer(nucs));
+ om.registerModule(mod);
+ battle = om.readValue(jn.get("battle").toString(), Battle.class);
+ // winner pre-check
+ for (String t : nucs.keySet()) {
+ if (nucs.keySet().stream().filter(login -> !t.equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) {
+ report.setType(ReportType.WINNER);
+ report.setPlayer(t);
+ exportReport(reportPath, report);
+ return;
+ }
+ nucs.computeIfPresent(t, (k, tmp) -> new Nuc(tmp.getName(), Math.clamp(tmp.getHp(), 0, 100), tmp.getInstalledPrograms()));
+ }
+ for (Turn t : battle.getTurns()) {
+ if (nucs.get(t.getPlayerLogin()) == null || nucs.get(t.getTargetLogin()) == null) {
+ report.setType(ReportType.ERROR);
+ exportReport(reportPath, report);
+ return;
+ }
+ // cheater check
+ if (!t.getPlayerNuc().getInstalledPrograms().containsAll(t.getPacket().getUsedPrograms())) {
+ report.setType(ReportType.CHEATER);
+ report.setPlayer(t.getPlayerLogin());
+ exportReport(reportPath, report);
+ return;
+ }
+ // swap nukes to update damage
+ Nuc n = nucs.get(t.getTargetLogin());
+ Nuc tmp = new Nuc(n.getName(), Math.clamp(n.getHp() - t.getPacket().getDamage(), 0, 100),
+ n.getInstalledPrograms());
+ nucs.put(t.getTargetLogin(), tmp);
+
+ // winner check
+ if (nucs.keySet().stream().filter(login -> !t.getPlayerLogin().equals(login)).allMatch(login -> nucs.get(login).getHp() == 0.0)) {
+ report.setType(ReportType.WINNER);
+ report.setPlayer(t.getPlayerLogin());
+ exportReport(reportPath, report);
+ return;
+ }
+ }
+ report.setType(ReportType.UNFINISHED);
+ exportReport(reportPath, report);
+ } catch (IOException e) {
+ report.setType(ReportType.ERROR);
+ exportReport(reportPath, report);
+ }
+ }
+
+ private void exportReport(String reportPath, Report report) {
+ if (report.getType() != ReportType.ERROR && report.getType() != ReportType.CHEATER) {
+ report.outcome = new HashMap<>();
+ for (String login : nucs.keySet()) {
+ report.outcome.put(login, nucs.get(login).getHp());
+ }
+ }
+ ObjectMapper om = new ObjectMapper();
+ try {
+ om.writeValue(new File(reportPath), report);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java
new file mode 100644
index 0000000..e2e4a48
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Nuc.java
@@ -0,0 +1,20 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Nuc {
+ private String name;
+
+ private float hp;
+
+ @JsonProperty("installed_programs")
+ private List<String> installedPrograms;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java
new file mode 100644
index 0000000..e8806f7
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Packet.java
@@ -0,0 +1,20 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Packet {
+ @JsonProperty("used_programs")
+ private List<String> usedPrograms;
+
+ private String command;
+
+ private float damage;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java
new file mode 100644
index 0000000..56aa10d
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Report.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.Map;
+
+@NoArgsConstructor
+@Getter
+@Setter
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Report {
+ ReportType type = ReportType.UNFINISHED;
+ String player = null;
+ Map<String, Float> outcome = null;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java
new file mode 100644
index 0000000..c643c1b
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/ReportType.java
@@ -0,0 +1,14 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+public enum ReportType {
+ @JsonProperty("winner")
+ WINNER,
+ @JsonProperty("cheater")
+ CHEATER,
+ @JsonProperty("error")
+ ERROR,
+ @JsonProperty("unfinished")
+ UNFINISHED;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java
new file mode 100644
index 0000000..57e44dc
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/Turn.java
@@ -0,0 +1,18 @@
+package fr.epita.assistants.nucbattle;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public class Turn {
+ private Nuc playerNuc;
+ private String playerLogin;
+
+ private Nuc targetNuc;
+ private String targetLogin;
+
+ private Packet packet;
+}
diff --git a/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java
new file mode 100644
index 0000000..bfd60ba
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/java/fr/epita/assistants/nucbattle/TurnDeserializer.java
@@ -0,0 +1,30 @@
+package fr.epita.assistants.nucbattle;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class TurnDeserializer extends JsonDeserializer<Turn> {
+ public TurnDeserializer(Map<String, Nuc> nucs) {
+ this.nucs = nucs;
+ }
+
+ Map<String, Nuc> nucs;
+ @Override
+ public Turn deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
+ JsonNode node = jsonParser.getCodec().readTree(jsonParser);
+ String player_login = node.get("player_login").asText();
+ String target_login = node.get("target_login").asText();
+
+ final ObjectMapper om = new ObjectMapper();
+ Packet packet = om.readValue(node.get("packet").toString(), Packet.class);
+ return new Turn(nucs.get(player_login), player_login, nucs.get(target_login), target_login, packet);
+ }
+}
diff --git a/graphs/java/nucBattle/src/main/resources/exampleBattle1.json b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json
new file mode 100644
index 0000000..3d541dd
--- /dev/null
+++ b/graphs/java/nucBattle/src/main/resources/exampleBattle1.json
@@ -0,0 +1,66 @@
+{
+ "NUCs": {
+ "xavier.login": {
+ "name": "r01p02",
+ "hp": 50.0,
+ "installed_programs": [
+ "yes",
+ "grep",
+ "pkill",
+ "ping",
+ "bash"
+ ]
+ },
+ "xavier.login2": {
+ "name": "r04p03",
+ "hp": 72.0,
+ "installed_programs": [
+ "find",
+ "cp",
+ "bash",
+ "wget"
+ ]
+ }
+ },
+ "battle": {
+ "battle_id": 9876,
+ "turns": [
+ {
+ "player_login": "xavier.prout",
+ "target_login": "xavier.login2",
+ "packet": {
+ "used_programs": [
+ "bash",
+ "yes"
+ ],
+ "command": "yes > ~/y",
+ "damage": 51.0
+ }
+ },
+ {
+ "player_login": "xavier.login2",
+ "target_login": "xavier.login",
+ "packet": {
+ "used_programs": [
+ "bash",
+ "cp",
+ "find"
+ ],
+ "command": "find / -type f -exec cp {} /tmp/ \\;",
+ "damage": 21.0
+ }
+ },
+ {
+ "player_login": "xavier.login",
+ "target_login": "xavier.login2",
+ "packet": {
+ "used_programs": [
+ "bash"
+ ],
+ "command": ":(){:|: &};:",
+ "damage": 32.0
+ }
+ }
+ ]
+ }
+}