Added - admins can modify sealed format visibility

This commit is contained in:
jakub.salavec
2025-06-18 11:29:51 +02:00
parent a5197fd6b6
commit 71092139fd
5 changed files with 105 additions and 1 deletions

View File

@@ -130,11 +130,31 @@ public class AdminRequestHandler extends LotroServerRequestHandler implements Ur
unBanUser(request, responseWriter);
} else if (uri.equals("/findMultipleAccounts") && request.method() == HttpMethod.POST) {
findMultipleAccounts(request, responseWriter);
} else if (uri.equals("/toggleSealedHallStatus") && request.method() == HttpMethod.POST) {
toggleSealedHallStatus(request, responseWriter);
} else {
throw new HttpProcessingException(404);
}
}
private void toggleSealedHallStatus(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateEventAdmin(request);
var postDecoder = new HttpPostRequestDecoder(request);
String sealedFormatCodeStr = getFormParameterSafely(postDecoder, "sealedFormatCode");
Throw400IfStringNull("sealedFormatCode", sealedFormatCodeStr);
var sealedFormat = _formatLibrary.GetSealedTemplate(sealedFormatCodeStr);
Throw400IfValidationFails("sealedFormatCode", sealedFormatCodeStr,sealedFormat != null);
if (_formatLibrary.toggleSealedInHall(sealedFormatCodeStr)) {
responseWriter.writeHtmlResponse("Added format");
} else {
responseWriter.writeHtmlResponse("Removed format");
}
}
private void setTournamentStage(HttpRequest request, ResponseWriter responseWriter) throws Exception {
validateEventAdmin(request);
var postDecoder = new HttpPostRequestDecoder(request);

View File

@@ -33,6 +33,7 @@ import java.lang.reflect.Type;
import java.text.DecimalFormat;
import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -109,6 +110,7 @@ public class TournamentRequestHandler extends LotroServerRequestHandler implemen
data.sealed = _formatLibrary.getAllHallSealedTemplates().values().stream()
.map(sealed -> new JSONDefs.ItemStub(sealed.GetID(), sealed.GetName().substring(3)))
.collect(Collectors.toList());
data.sealed.sort(Comparator.comparing(o -> _formatLibrary.GetSealedTemplate(o.code).GetName())); // Sort by sealed format number
data.soloDrafts = orderedSoloDrafts.stream()
.filter(code -> _soloDraftDefinitions.getAllSoloDrafts().values().stream().anyMatch(soloDraft -> code.equals(soloDraft.getCode()))).map(code -> new JSONDefs.ItemStub(code, availableSoloDraftFormats.get(code)))
.collect(Collectors.toList());

View File

@@ -97,6 +97,18 @@ $(document).ready(
}, tourneyErrorMap(resultdiv));
});
$("#toggle-sealed-button").button().click(
function () {
let resultdiv = $("#toggle-sealed-result");
resultdiv.html("Processing...");
hall.comm.toggleSealedHallStatus(
$("#toggle-sealed-select").val(),
function (xml) {
resultdiv.html(xml);
}, tourneyErrorMap(resultdiv));
});
$("#preview-sch-tourney-button").button().click(
function () {
let resultdiv = $("#sch-tourney-result");
@@ -254,9 +266,15 @@ $(document).ready(
.attr("value", id)
.text(prop + " - " + serieCount + " Series");
$("#sch-tourney-sealed-format").append(item);
var item2 = $("<option/>")
.attr("value", id)
.text(prop);
$("#toggle-sealed-select").append(item2);
}
}
sortOptionsByName("#sch-tourney-sealed-format");
sortOptionsByName("#toggle-sealed-select");
for (var prop in drafts) {
if (Object.prototype.hasOwnProperty.call(drafts, prop)) {
@@ -457,6 +475,37 @@ function tourneyErrorMap(outputControl, callback=null) {
<br/><br/><hr><br/><br/>
<div id="toggle-sealed-hall-section" class="league-form">
<h1>Toggle Sealed Format Hall Status</h1>
<div class="flex-horiz">
<div class="label-column">Sealed Format: </div>
<select id="toggle-sealed-select" class="flex-fill"></select>
</div>
<div>
<p>If chosen sealed format is already available in hall, this will disable it. If the format is not available
in hall, this will enable it.</p>
<p>The changes made using this form are in effect only until server restart or json definitions reload.</p>
<p>For permanent change, remove or add "hall: true" field in the sealed format json definition.</p>
</div>
<button id="toggle-sealed-button">
Toggle Sealed Format Hall Status
</button>
<div id=toggle-sealed-result-label" class="flex-horiz result-label">
<div class="label">
<b>Result:</b>
</div>
<div id="toggle-sealed-result" class="flex-fill result-box">
Ready.
</div>
</div>
</div>
<br/><br/><hr><br/><br/>
<div id="sch-tourney-section" class="league-form">
<h1>Add Scheduled Tournament</h1>
<div class="flex-horiz">

View File

@@ -1470,5 +1470,18 @@ var GempLotrCommunication = Class.extend({
error:this.errorCheck(errorMap),
dataType:"json"
});
}
},
toggleSealedHallStatus:function (sealedFormatCode, callback, errorMap) {
$.ajax({
type:"POST",
url:this.url + "/admin/toggleSealedHallStatus",
cache:false,
data:{
sealedFormatCode:sealedFormatCode
},
success:callback,
error:this.errorCheck(errorMap),
dataType:"html"
});
}
});

View File

@@ -241,6 +241,26 @@ public class LotroFormatLibrary {
}
}
public boolean toggleSealedInHall(String code) {
try {
collectionReady.acquire();
boolean tbr = false;
if (_hallSealedTemplates.containsKey(code)) {
_hallSealedTemplates.remove(code);
} else if (_sealedTemplates.containsKey(code)) {
_hallSealedTemplates.put(code, _sealedTemplates.get(code));
tbr = true;
}
collectionReady.release();
return tbr;
}
catch (InterruptedException exp) {
throw new RuntimeException("FormatLibrary.toggleSealedInHall() interrupted: ", exp);
}
}
public SealedEventDefinition GetSealedTemplateByFormatCode(String formatCode) {
try {
collectionReady.acquire();