Skip to content

Commit

Permalink
Implement websocket matches
Browse files Browse the repository at this point in the history
Co-authored-by: Pablete1234 <[email protected]>
Signed-off-by: Pablete1234 <[email protected]>
  • Loading branch information
Pugzy and Pablete1234 committed Aug 3, 2022
1 parent ee9bbed commit 6ffc7f3
Show file tree
Hide file tree
Showing 63 changed files with 2,951 additions and 581 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ local.properties
.classpath
.project

# VSCode
.vscode

# External tool builders
.externalToolBuilders/

Expand Down
11 changes: 8 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,15 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.applenick</groupId>
<groupId>com.github.Pablete1234</groupId>
<artifactId>PGM</artifactId>
<version>community-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.PGMDev</groupId>
<groupId>com.github.bolt-rip</groupId>
<artifactId>Events</artifactId>
<version>070c088acd</version>
<version>team-refactor-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand All @@ -78,6 +78,11 @@
<artifactId>taskchain-bukkit</artifactId>
<version>3.7.2</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.1</version>
</dependency>
</dependencies>

<build>
Expand Down
60 changes: 42 additions & 18 deletions src/main/java/rip/bolt/ingame/Ingame.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,42 @@
import co.aikar.taskchain.BukkitTaskChainFactory;
import co.aikar.taskchain.TaskChain;
import co.aikar.taskchain.TaskChainFactory;
import dev.pgm.events.Tournament;
import dev.pgm.events.EventsPlugin;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import rip.bolt.ingame.api.APIManager;
import rip.bolt.ingame.commands.AdminCommands;
import rip.bolt.ingame.commands.ForfeitCommands;
import rip.bolt.ingame.commands.RankedAdminCommands;
import rip.bolt.ingame.commands.PugCommands;
import rip.bolt.ingame.commands.RequeueCommands;
import rip.bolt.ingame.ranked.RankedManager;
import rip.bolt.ingame.managers.MatchManager;
import rip.bolt.ingame.utils.AudienceProvider;
import rip.bolt.ingame.utils.MapInfoParser;
import rip.bolt.ingame.utils.PartyProvider;
import rip.bolt.ingame.utils.TeamsProvider;
import tc.oc.pgm.api.PGM;
import tc.oc.pgm.api.map.MapInfo;
import tc.oc.pgm.api.map.MapOrder;
import tc.oc.pgm.api.match.Match;
import tc.oc.pgm.api.party.Party;
import tc.oc.pgm.api.player.MatchPlayer;
import tc.oc.pgm.command.graph.CommandExecutor;
import tc.oc.pgm.command.graph.MatchPlayerProvider;
import tc.oc.pgm.command.graph.MatchProvider;
import tc.oc.pgm.lib.app.ashcon.intake.bukkit.graph.BasicBukkitCommandGraph;
import tc.oc.pgm.lib.app.ashcon.intake.fluent.DispatcherNode;
import tc.oc.pgm.lib.app.ashcon.intake.parametric.AbstractModule;
import tc.oc.pgm.teams.TeamMatchModule;
import tc.oc.pgm.util.Audience;

public class Ingame extends JavaPlugin {

private static TaskChainFactory taskChainFactory;
private RankedManager rankedManager;
private MatchManager matchManager;
private APIManager apiManager;

private PugCommands pugCommands;

private static Ingame plugin;

@Override
Expand All @@ -38,22 +50,25 @@ public void onEnable() {

apiManager = new APIManager();

rankedManager = new RankedManager(this);
matchManager = new MatchManager(this);

Bukkit.getPluginManager().registerEvents(rankedManager, this);
Bukkit.getPluginManager().registerEvents(rankedManager.getPlayerWatcher(), this);
Bukkit.getPluginManager().registerEvents(rankedManager.getRankManager(), this);
Bukkit.getPluginManager().registerEvents(rankedManager.getRequeueManager(), this);
Bukkit.getPluginManager().registerEvents(rankedManager.getSpectatorManager(), this);
Bukkit.getPluginManager().registerEvents(rankedManager.getKnockbackManager(), this);
Bukkit.getPluginManager().registerEvents(matchManager, this);
Bukkit.getPluginManager().registerEvents(matchManager.getRankManager(), this);

BasicBukkitCommandGraph g = new BasicBukkitCommandGraph(new CommandModule());
DispatcherNode node = g.getRootDispatcherNode();
node.registerCommands(new RequeueCommands(rankedManager));
node.registerCommands(new ForfeitCommands(rankedManager));
node.registerCommands(new RequeueCommands(matchManager));
node.registerCommands(new ForfeitCommands(matchManager));

node.registerNode("ingame").registerCommands(new AdminCommands(matchManager));

DispatcherNode pugNode = node.registerNode("pug");
pugCommands = new PugCommands(matchManager);
pugNode.registerCommands(pugCommands);
pugNode.registerNode("team").registerCommands(pugCommands.getTeamCommands());

pugCommands.setCommandList(pugNode.getDispatcher().getAliases());

DispatcherNode subNode = node.registerNode("ingame");
subNode.registerCommands(new RankedAdminCommands(rankedManager));
new CommandExecutor(this, g).register();

System.out.println("[Ingame] Ingame is now enabled!");
Expand All @@ -77,8 +92,12 @@ public APIManager getApiManager() {
return apiManager;
}

public RankedManager getRankedManager() {
return rankedManager;
public MatchManager getMatchManager() {
return matchManager;
}

public PugCommands getPugCommands() {
return pugCommands;
}

public static Ingame get() {
Expand All @@ -95,12 +114,17 @@ protected void configure() {

private void configureInstances() {
bind(PGM.class).toInstance(PGM.get());
bind(Tournament.class).toInstance(Tournament.get());
bind(EventsPlugin.class).toInstance(EventsPlugin.get());
bind(MapOrder.class).toInstance(PGM.get().getMapOrder());
}

private void configureProviders() {
bind(MatchPlayer.class).toProvider(new MatchPlayerProvider());
bind(Match.class).toProvider(new MatchProvider());
bind(Party.class).toProvider(new PartyProvider());
bind(TeamMatchModule.class).toProvider(new TeamsProvider());
bind(Audience.class).toProvider(new AudienceProvider());
bind(MapInfo.class).toProvider(new MapInfoParser());
}
}
}
14 changes: 14 additions & 0 deletions src/main/java/rip/bolt/ingame/api/APIException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package rip.bolt.ingame.api;

public class APIException extends RuntimeException {
private final int code;

public APIException(String message, int code) {
super(message + " (" + code + ")");
this.code = code;
}

public int getCode() {
return code;
}
}
31 changes: 23 additions & 8 deletions src/main/java/rip/bolt/ingame/api/APIManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@
public class APIManager {

private final String serverId;

public final APIService apiService;
public final ObjectMapper objectMapper;

public APIManager() {
serverId = AppData.API.getServerName();
objectMapper = new ObjectMapper().registerModule(new DateModule());

ObjectMapper objectMapper = new ObjectMapper().registerModule(new DateModule());
objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);
Expand Down Expand Up @@ -57,19 +60,31 @@ public BoltResponse postPlayerRequeue(UUID uuid) {

public BoltMatch postMatch(BoltMatch match) {
int retries = 40;

final int PRECONDITION_FAILED = 412;

for (int i = 0; i < retries; ) {
try {
return apiService.postMatch(match.getId(), match);
} catch (APIException ex) {
ex.printStackTrace();
if (ex.getCode() == PRECONDITION_FAILED && i > 2) return match;
} catch (Exception ex) {
i += 1;

System.out.println(
"Failed to report match end, retrying in " + (i * 5) + "s (" + i + "/" + retries + ")");
ex.printStackTrace();
try {
Thread.sleep(i * 5000L);
} catch (InterruptedException ignore) {
}
}

i += 1;
System.out.println(
"[Ingame] Failed to report match end, retrying in "
+ (i * 5)
+ "s ("
+ i
+ "/"
+ retries
+ ")");
try {
Thread.sleep(i * 5000L);
} catch (InterruptedException ignore) {
}
}
return null;
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/rip/bolt/ingame/api/DateModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
Expand Down Expand Up @@ -30,7 +29,7 @@ public void serialize(
private static class InstantDeserializer extends JsonDeserializer<Instant> {
@Override
public Instant deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
throws IOException {
return Instant.parse(jsonParser.getValueAsString());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ private static String getErrorMessage(final retrofit2.Response<?> response) {
try (ResponseBody errorBody = response.errorBody()) {
return Objects.isNull(errorBody) ? response.message() : errorBody.string();
} catch (IOException e) {
throw new RuntimeException("could not read error body", e);
e.printStackTrace();
return "Failed to read error message";
}
}

Expand Down Expand Up @@ -57,7 +58,7 @@ public Object adapt(final Call<T> call) {
if (response.code() == NOT_FOUND) {
return null;
}
throw new RuntimeException(getErrorMessage(response));
throw new APIException(getErrorMessage(response), response.code());
}
return response.body();
}
Expand Down
33 changes: 32 additions & 1 deletion src/main/java/rip/bolt/ingame/api/definitions/BoltMatch.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import rip.bolt.ingame.ranked.MatchStatus;
import java.util.stream.Collectors;
import rip.bolt.ingame.api.definitions.pug.PugMatch;

@JsonIgnoreProperties(ignoreUnknown = true)
public class BoltMatch {

private String id;
private String lobbyId;
private Series series;

private BoltPGMMap map;
Expand All @@ -29,6 +31,15 @@ public BoltMatch(String matchId) {
this.id = matchId;
}

public BoltMatch(String lobbyId, Series series, PugMatch pugMatch) {
this.id = pugMatch.getId();
this.lobbyId = lobbyId;
this.series = series;
this.map = pugMatch.getMap();
this.teams = pugMatch.getTeamIds().stream().map(Team::new).collect(Collectors.toList());
this.status = pugMatch.getStatus();
}

public String getId() {
return id;
}
Expand All @@ -37,6 +48,14 @@ public void setId(String id) {
this.id = id;
}

public String getLobbyId() {
return lobbyId;
}

public void setLobbyId(String lobbyId) {
this.lobbyId = lobbyId;
}

public Series getSeries() {
return series;
}
Expand Down Expand Up @@ -93,6 +112,15 @@ public void setStatus(MatchStatus status) {
this.status = status;
}

public Participation getParticipation(UUID uuid) {
return teams.stream()
.map(Team::getParticipations)
.flatMap(Collection::stream)
.filter(participation -> participation.getUser().getUUID().equals(uuid))
.findFirst()
.orElse(null);
}

public User getUser(UUID uuid) {
return teams.stream()
.map(Team::getParticipations)
Expand All @@ -110,6 +138,9 @@ public String toString() {
.append("Match ID: ")
.append(getId())
.append("\n")
.append("Lobby ID: ")
.append(getLobbyId())
.append("\n")
.append("Series: ")
.append(getSeries())
.append("\n")
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/rip/bolt/ingame/api/definitions/BoltPGMMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public class BoltPGMMap {

private Integer id;
private String name;
private String slug;

public BoltPGMMap() {}

Expand Down Expand Up @@ -34,8 +35,16 @@ public void setName(String name) {
this.name = name;
}

public String getSlug() {
return slug;
}

public void setSlug(String slug) {
this.slug = slug;
}

@Override
public String toString() {
return "{" + " id='" + getId() + "'" + ", name='" + getName() + "'" + "}";
return "BoltPGMMap{" + "id=" + id + ", name='" + name + '\'' + ", slug='" + slug + '\'' + '}';
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package rip.bolt.ingame.ranked;
package rip.bolt.ingame.api.definitions;

public enum MatchStatus {
CREATED,
LOADED,
CANCELLED,
STARTED,
ENDED,
CANCELLED;
ENDED;

public boolean canTransitionTo(MatchStatus next) {
switch (this) {
Expand All @@ -23,6 +23,14 @@ public boolean canTransitionTo(MatchStatus next) {
}
}

public boolean isPreGame() {
return this == CREATED || this == LOADED;
}

public boolean isFinished() {
return this == ENDED || this == CANCELLED;
}

public String toString() {
return this.name();
}
Expand Down
Loading

0 comments on commit 6ffc7f3

Please sign in to comment.