diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/TournamentRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/TournamentRequestHandler.java
index 64058aea2..a67910790 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/TournamentRequestHandler.java
+++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/handler/TournamentRequestHandler.java
@@ -145,7 +145,7 @@ public class TournamentRequestHandler extends LotroServerRequestHandler implemen
Document doc = documentBuilder.newDocument();
Element tournaments = doc.createElement("tournaments");
- for (Tournament tournament : _tournamentService.getOldTournaments(ZonedDateTime.now().minus(RecentTournamentDuration))) {
+ for (Tournament tournament : _tournamentService.getOldTournaments(ZonedDateTime.now().minus(RecentTournamentDuration)).reversed()) {
Element tournamentElem = doc.createElement("tournament");
tournamentElem.setAttribute("id", tournament.getTournamentId());
@@ -155,6 +155,10 @@ public class TournamentRequestHandler extends LotroServerRequestHandler implemen
tournamentElem.setAttribute("round", String.valueOf(tournament.getCurrentRound()));
tournamentElem.setAttribute("stage", tournament.getTournamentStage().getHumanReadable());
+ if (tournament.getTournamentStage().equals(Tournament.Stage.FINISHED) && tournament.getCurrentRound() == 0) {
+ // do NOT include past tournaments with 0 games played (for example draft of one player against bots)
+ continue;
+ }
tournaments.appendChild(tournamentElem);
}
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js
index b57a1e81f..c8bca0857 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js
+++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/chat.js
@@ -409,6 +409,7 @@ var ChatBoxUI = Class.extend({
if(this.tournamentCallback) {
this.tournamentCallback(from, text);
}
+ from = "TournamentSystem";
}
var prefix = "
";
if (this.showTimestamps) {
diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/tournamentResultsUi.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/tournamentResultsUi.js
index d31e30e89..ae3b7058e 100644
--- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/tournamentResultsUi.js
+++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/tournamentResultsUi.js
@@ -35,13 +35,11 @@ var TournamentResultsUI = Class.extend({
});
},
- loadedTournament:function (xml) {
+ loadedTournament:function (xml, targetDiv) {
var that = this;
log(xml);
var root = xml.documentElement;
if (root.tagName == 'tournament') {
- $("#tournamentExtraInfo").html("");
-
var tournament = root;
var tournamentId = tournament.getAttribute("id");
@@ -51,16 +49,16 @@ var TournamentResultsUI = Class.extend({
var tournamentRound = tournament.getAttribute("round");
var tournamentStage = tournament.getAttribute("stage");
- $("#tournamentExtraInfo").append("
" + tournamentName + "
");
-
- $("#tournamentExtraInfo").append("
Format: " + tournamentFormat + "
");
- $("#tournamentExtraInfo").append("
Collection: " + tournamentCollection + "
");
+ targetDiv.append("
Format: " + tournamentFormat + "
");
+ targetDiv.append("
Collection: " + tournamentCollection + "
");
if (tournamentStage == "Playing games")
- $("#tournamentExtraInfo").append("
");
var detailsBut = $("").button();
+ $("#tournamentResults").append(detailsBut);
+
+ var extraInfoDiv = $("");
+ $("#tournamentResults").append(extraInfoDiv);
+
detailsBut.click(
- (function (id) {
+ (function (id, extraInfoTarget) {
return function () {
+ var btn = $(this);
that.communication.getTournament(id,
function (xml) {
- that.loadedTournament(xml);
+ that.loadedTournament(xml, extraInfoTarget);
+ btn.hide();
});
};
- })(tournamentId));
- $("#tournamentResults").append(detailsBut);
+ })(tournamentId, extraInfoDiv));
}
if (tournaments.length == 0)
$("#tournamentResults").append("There is no running tournaments at the moment");
-
- $("#tournamentResults").append("");
- $("#tournamentResults").append("");
}
},
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java
index f3354efb3..34a0e0a32 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java
@@ -555,10 +555,11 @@ public class HallServer extends AbstractServer {
if (tournament.getInfo().Parameters().requiresDeck) {
lotroDeck = validateUserAndDeck(_formatLibrary.getFormat(tournament.getFormatCode()), player, deckName, tournament.getCollectionType());
}
-
- _tournamentService.recordTournamentPlayer(tournamentId, player.getName(), lotroDeck);
- tournament.issuePlayerMaterial(player.getName());
- result = "Joined tournament " + tournament.getTournamentName() + " successfully.";
+ if (_tournamentService.joinTournamentLate(tournamentId, player.getName(), lotroDeck)) {
+ result = "Joined tournament " + tournament.getTournamentName() + " successfully.";
+ } else {
+ result = "Joining tournament " + tournament.getTournamentName() + " failed.";
+ }
hallChanged();
}
@@ -582,13 +583,13 @@ public class HallServer extends AbstractServer {
var submitted = tournament.playerSubmittedDeck(player.getName(), lotroDeck);
if(submitted) {
- result = "Registered deck '" + deckName + "' with tournament " + tournament.getTournamentName() + " successfully."
- + "
If you make an update to your deck, you will need to register it here again for any changes to take effect.";
+ result = "Registered deck '" + deckName + "' with tournament '" + tournament.getTournamentName() + "' successfully. "
+ + "If you make an update to your deck, you will need to register it here again for any changes to take effect.";
_log.trace("Player '" + player.getName() + "' registered deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "' successfully.");
}
else {
- result = "Could not register deck with tournament " + tournament.getTournamentName() + "."
- + "
Please contact an administrator if you think this was in error.";
+ result = "Could not register deck with tournament '" + tournament.getTournamentName() + "'. "
+ + "Please contact an administrator if you think this was in error.";
_log.trace("Player '" + player.getName() + "' failed to register deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "'.");
}
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java
index e7d84faa6..e2fa9de02 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java
@@ -536,4 +536,26 @@ public abstract class BaseTournament implements Tournament {
public String getTableDescription() {
return null;
}
+
+ @Override
+ public boolean join(String playerName, LotroDeck lotroDeck) {
+ // Assumes the deck is validated for the tournament or null if the tournament is limited
+ writeLock.lock();
+ try {
+ if (!isJoinable()) {
+ return false;
+ }
+
+ if (_players.contains(playerName)) {
+ return false;
+ }
+ _tournamentService.recordTournamentPlayer(_tournamentId, playerName, lotroDeck);
+ issuePlayerMaterial(playerName);
+ _players.add(playerName);
+ regeneratePlayerList();
+ return true;
+ } finally {
+ writeLock.unlock();
+ }
+ }
}
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java
index 863188b82..fef2956bd 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java
@@ -206,6 +206,7 @@ public interface Tournament {
TournamentInfo getInfo();
boolean isJoinable();
+ boolean join(String playerName, LotroDeck lotroDeck);
long getSecondsRemaining() throws IllegalStateException;
String getTableDescription();
}
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
index 31c0e83da..8f0104e59 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
@@ -332,6 +332,15 @@ public class TournamentService {
_tournamentPlayerDao.addPlayer(tournamentId, playerName, deck);
}
+ public boolean joinTournamentLate(String tournamentId, String playerName, LotroDeck deck) {
+ // Assumes the deck is validated for the tournament or null if the tournament is limited
+ Tournament tournament = getTournamentById(tournamentId);
+ if (tournament == null) {
+ return false;
+ }
+ return tournament.join(playerName, deck);
+ }
+
public void recordPlayerTournamentAbandon(String tournamentId, String playerName) {
_tournamentPlayerDao.dropPlayer(tournamentId, playerName);
}