Compare commits
10
Commits
bceff701bf
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1a614bc9a | ||
|
|
6adc007313 | ||
|
|
54f160e8d0 | ||
|
|
5965fd51c7 | ||
|
|
2eb946a042 | ||
|
|
81110a2852 | ||
|
|
3b0f2de5b2 | ||
|
|
e173ae8056 | ||
|
|
e7f101ddee | ||
|
|
3fae7e5b4c |
@@ -1,3 +1,7 @@
|
|||||||
|
.env
|
||||||
|
.env.just
|
||||||
|
local.just
|
||||||
|
|
||||||
*.sfc
|
*.sfc
|
||||||
appsettings.Development.json
|
appsettings.Development.json
|
||||||
kube/
|
kube/
|
||||||
|
|||||||
@@ -24,8 +24,9 @@
|
|||||||
await BlobClient.UploadBlobAsync(name, data);
|
await BlobClient.UploadBlobAsync(name, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UploadFile(string name, BinaryData data) {
|
public async Task UploadFile(string name, BinaryData data, bool overwrite = false) {
|
||||||
await BlobClient.UploadBlobAsync(name, data);
|
var client = BlobClient.GetBlobClient(name);
|
||||||
|
await client.UploadAsync(data, overwrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UploadFileFromSource(string name, string filepath) {
|
public async Task UploadFileFromSource(string name, string filepath) {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
public RandomizableWeights<DungeonItemLocations> Compasses { get; set; } = new();
|
public RandomizableWeights<DungeonItemLocations> Compasses { get; set; } = new();
|
||||||
|
|
||||||
public RandomizableWeights<ShowLoot> ShowLoot { get; set; } = new();
|
public RandomizableWeights<ShowLootMap> ShowLootMap { get; set; } = new();
|
||||||
|
|
||||||
public RandomizableWeights<ShowLootHud> ShowLootHud { get; set; } = new();
|
public RandomizableWeights<ShowLootHud> ShowLootHud { get; set; } = new();
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,24 @@
|
|||||||
namespace ALttPRandomizer.Model {
|
namespace ALttPRandomizer.Model {
|
||||||
using ALttPRandomizer.Settings;
|
using ALttPRandomizer.Settings;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using YamlDotNet.Serialization;
|
|
||||||
using static ALttPRandomizer.Model.RandomizerInstance;
|
using static ALttPRandomizer.Model.RandomizerInstance;
|
||||||
|
|
||||||
public class SeedSettings {
|
public class SeedSettings {
|
||||||
[NoSettingName]
|
[NoSettingName]
|
||||||
public RandomizerInstance Randomizer { get; set; } = RandomizerInstance.Base;
|
public RandomizerInstance Randomizer { get; set; } = RandomizerInstance.Base;
|
||||||
|
|
||||||
[NoSettingName]
|
[IgnoreSetting]
|
||||||
public string PlayerName { get; set; } = string.Empty;
|
public string PlayerName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
[IgnoreSetting]
|
||||||
|
public int PlayerSlot { get; set; } = 1;
|
||||||
|
|
||||||
[NoSettingName]
|
[NoSettingName]
|
||||||
public RaceMode Race { get; set; } = RaceMode.Normal;
|
public RaceMode Race { get; set; } = RaceMode.Normal;
|
||||||
|
|
||||||
|
[NoSettingName]
|
||||||
|
public MysteryMode Mystery { get; set; } = MysteryMode.Normal;
|
||||||
|
|
||||||
[ForbiddenSetting([Apr2025], Mode.Inverted)]
|
[ForbiddenSetting([Apr2025], Mode.Inverted)]
|
||||||
[RequiredSetting([Pikit], Mode.Open)]
|
[RequiredSetting([Pikit], Mode.Open)]
|
||||||
public Mode Mode { get; set; } = Mode.Open;
|
public Mode Mode { get; set; } = Mode.Open;
|
||||||
@@ -46,6 +51,10 @@
|
|||||||
[IgnoreSetting(Apr2025)]
|
[IgnoreSetting(Apr2025)]
|
||||||
public GanonItem GanonItem { get; set; } = GanonItem.Silver;
|
public GanonItem GanonItem { get; set; } = GanonItem.Silver;
|
||||||
|
|
||||||
|
[NoSettingName]
|
||||||
|
[IgnoreSetting(Apr2025)]
|
||||||
|
public RequireGanonItem RequireGanonItem { get; set; } = RequireGanonItem.SilverlessAllowed;
|
||||||
|
|
||||||
[SettingName("shuffle")]
|
[SettingName("shuffle")]
|
||||||
[ForbiddenSetting([Apr2025], EntranceShuffle.Swapped)]
|
[ForbiddenSetting([Apr2025], EntranceShuffle.Swapped)]
|
||||||
public EntranceShuffle EntranceShuffle { get; set; } = EntranceShuffle.Vanilla;
|
public EntranceShuffle EntranceShuffle { get; set; } = EntranceShuffle.Vanilla;
|
||||||
@@ -97,10 +106,10 @@
|
|||||||
|
|
||||||
[SettingName("showloot")]
|
[SettingName("showloot")]
|
||||||
[IgnoreSetting(Apr2025)]
|
[IgnoreSetting(Apr2025)]
|
||||||
public ShowLoot ShowLoot { get; set; } = ShowLoot.Never;
|
public ShowLootMap ShowLootMap { get; set; } = ShowLootMap.Never;
|
||||||
|
|
||||||
[SettingName("loothud")]
|
[SettingName("loothud")]
|
||||||
[IgnoreSetting(Apr2025, Base)]
|
[IgnoreSetting(Apr2025)]
|
||||||
public ShowLootHud ShowLootHud { get; set; } = ShowLootHud.Never;
|
public ShowLootHud ShowLootHud { get; set; } = ShowLootHud.Never;
|
||||||
|
|
||||||
[SettingName("showmap")]
|
[SettingName("showmap")]
|
||||||
@@ -163,7 +172,7 @@
|
|||||||
public TrapDoorMode TrapDoorMode { get; set; } = TrapDoorMode.Some;
|
public TrapDoorMode TrapDoorMode { get; set; } = TrapDoorMode.Some;
|
||||||
|
|
||||||
[SettingName("extra_keys")]
|
[SettingName("extra_keys")]
|
||||||
[IgnoreSetting(Apr2025, Base)]
|
[IgnoreSetting(Apr2025)]
|
||||||
public ExtraKeysMode ExtraKeys { get; set; } = ExtraKeysMode.None;
|
public ExtraKeysMode ExtraKeys { get; set; } = ExtraKeysMode.None;
|
||||||
|
|
||||||
[NoSettingName]
|
[NoSettingName]
|
||||||
@@ -204,6 +213,12 @@
|
|||||||
|
|
||||||
[NoSettingName]
|
[NoSettingName]
|
||||||
public Hints Hints { get; set; } = Hints.Off;
|
public Hints Hints { get; set; } = Hints.Off;
|
||||||
|
|
||||||
|
public SeedSettings Clone() {
|
||||||
|
var newSettings = (SeedSettings) this.MemberwiseClone();
|
||||||
|
|
||||||
|
return newSettings;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum RandomizerInstance {
|
public enum RandomizerInstance {
|
||||||
@@ -218,6 +233,11 @@
|
|||||||
[AdditionalSetting("--securerandom")] Race,
|
[AdditionalSetting("--securerandom")] Race,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum MysteryMode {
|
||||||
|
Normal,
|
||||||
|
[AdditionalSetting("--mystery")] Mystery,
|
||||||
|
}
|
||||||
|
|
||||||
public enum Mode {
|
public enum Mode {
|
||||||
Open,
|
Open,
|
||||||
Standard,
|
Standard,
|
||||||
@@ -311,6 +331,11 @@
|
|||||||
None,
|
None,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum RequireGanonItem {
|
||||||
|
SilverlessAllowed,
|
||||||
|
[AdditionalSetting("--require_ganon_item")] SpecialItemRequired,
|
||||||
|
}
|
||||||
|
|
||||||
public enum EntranceShuffle {
|
public enum EntranceShuffle {
|
||||||
Vanilla,
|
Vanilla,
|
||||||
Full,
|
Full,
|
||||||
@@ -405,7 +430,7 @@
|
|||||||
Wild,
|
Wild,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ShowLoot {
|
public enum ShowLootMap {
|
||||||
Never,
|
Never,
|
||||||
Presence,
|
Presence,
|
||||||
Compass,
|
Compass,
|
||||||
@@ -417,6 +442,7 @@
|
|||||||
Presence,
|
Presence,
|
||||||
Value,
|
Value,
|
||||||
[SettingName("dungeon_value")] DungeonValue,
|
[SettingName("dungeon_value")] DungeonValue,
|
||||||
|
[SettingName("cave_value")] CaveValue,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ShowMap {
|
public enum ShowMap {
|
||||||
@@ -455,6 +481,7 @@
|
|||||||
public enum BombSettings {
|
public enum BombSettings {
|
||||||
Normal,
|
Normal,
|
||||||
[AdditionalSetting("--bombbag")] BombBagRequired,
|
[AdditionalSetting("--bombbag")] BombBagRequired,
|
||||||
|
[AddStartingItems("Bombs_(10)")] Starting,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum BookSettings {
|
public enum BookSettings {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
using ALttPRandomizer.Randomizers;
|
using ALttPRandomizer.Randomizers;
|
||||||
using ALttPRandomizer.Service;
|
using ALttPRandomizer.Service;
|
||||||
using ALttPRandomizer.Settings;
|
using ALttPRandomizer.Settings;
|
||||||
|
using global::Azure.Core;
|
||||||
using global::Azure.Identity;
|
using global::Azure.Identity;
|
||||||
using global::Azure.Storage.Blobs;
|
using global::Azure.Storage.Blobs;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
@@ -14,12 +15,13 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using YamlDotNet.Serialization;
|
using YamlDotNet.Serialization;
|
||||||
using YamlDotNet.Serialization.NamingConventions;
|
using YamlDotNet.Serialization.NamingConventions;
|
||||||
|
|
||||||
internal class Program
|
internal class Program {
|
||||||
{
|
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
@@ -44,9 +46,15 @@
|
|||||||
var settings = provider.GetRequiredService<IOptionsMonitor<ServiceOptions>>().CurrentValue!;
|
var settings = provider.GetRequiredService<IOptionsMonitor<ServiceOptions>>().CurrentValue!;
|
||||||
var logger = provider.GetRequiredService<ILogger<Program>>();
|
var logger = provider.GetRequiredService<ILogger<Program>>();
|
||||||
|
|
||||||
|
var allowedCors = settings.AllowedCors;
|
||||||
|
var envCors = Environment.GetEnvironmentVariable("ALLOWED_CORS");
|
||||||
|
if (envCors != null) {
|
||||||
|
allowedCors = allowedCors.Concat(envCors.Split()).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
builder.Services.AddCors(options => {
|
builder.Services.AddCors(options => {
|
||||||
options.AddPolicy("AllowDomains", policy => {
|
options.AddPolicy("AllowDomains", policy => {
|
||||||
policy.WithOrigins(settings.AllowedCors.ToArray()).AllowAnyMethod().AllowAnyHeader();
|
policy.WithOrigins(allowedCors.ToArray()).AllowAnyMethod().AllowAnyHeader();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -75,13 +83,22 @@
|
|||||||
options.OperationFilter<DefaultMysterySettingsFilter>();
|
options.OperationFilter<DefaultMysterySettingsFilter>();
|
||||||
});
|
});
|
||||||
|
|
||||||
var options = new DefaultAzureCredentialOptions();
|
TokenCredential? token = null;
|
||||||
|
|
||||||
if (settings.AzureSettings.ClientId != null) {
|
if (Environment.GetEnvironmentVariable("USE_SAMI") == "true") {
|
||||||
options.ManagedIdentityClientId = new(settings.AzureSettings.ClientId);
|
token = new ManagedIdentityCredential(ManagedIdentityId.SystemAssigned);
|
||||||
|
} else {
|
||||||
|
var options = new DefaultAzureCredentialOptions();
|
||||||
|
|
||||||
|
var clientId = Environment.GetEnvironmentVariable("CLIENT_ID");
|
||||||
|
|
||||||
|
if (clientId != null) {
|
||||||
|
options.ManagedIdentityClientId = new(clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
token = new DefaultAzureCredential(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
var token = new DefaultAzureCredential(options);
|
|
||||||
var seedClient = new BlobContainerClient(settings.AzureSettings.BlobstoreEndpoint, token);
|
var seedClient = new BlobContainerClient(settings.AzureSettings.BlobstoreEndpoint, token);
|
||||||
|
|
||||||
builder.Services.AddSingleton(seedClient);
|
builder.Services.AddSingleton(seedClient);
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
public const int MULTI_TRIES = 100;
|
public const int MULTI_TRIES = 100;
|
||||||
public const int SINGLE_TRIES = 5;
|
public const int SINGLE_TRIES = 5;
|
||||||
|
|
||||||
|
private static readonly Random random = new();
|
||||||
|
|
||||||
public BaseRandomizer(
|
public BaseRandomizer(
|
||||||
AzureStorage azureStorage,
|
AzureStorage azureStorage,
|
||||||
CommonSettingsProcessor settingsProcessor,
|
CommonSettingsProcessor settingsProcessor,
|
||||||
@@ -64,10 +66,20 @@
|
|||||||
args.Add("--shuffletavern");
|
args.Add("--shuffletavern");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.Randomizer == RandomizerInstance.Beta) {
|
||||||
|
if (random.NextDouble() < 0.25) {
|
||||||
|
args.Add("--orange_potion");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (settings.DoorShuffle == DoorShuffle.Vanilla) {
|
if (settings.DoorShuffle == DoorShuffle.Vanilla) {
|
||||||
settings.DoorTypeMode = DoorTypeMode.Original;
|
settings.DoorTypeMode = DoorTypeMode.Original;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.GanonItem == GanonItem.None) {
|
||||||
|
settings.RequireGanonItem = RequireGanonItem.SilverlessAllowed;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var arg in SettingsProcessor.GetSettings(settings.Randomizer, settings)) {
|
foreach (var arg in SettingsProcessor.GetSettings(settings.Randomizer, settings)) {
|
||||||
args.Add(arg);
|
args.Add(arg);
|
||||||
}
|
}
|
||||||
@@ -113,7 +125,7 @@
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Randomize(string id, SeedSettings settings, bool uploadSettings = true) {
|
public async Task Randomize(string id, SeedSettings settings, bool uploadSettings = true, MysterySettings? mysterySettings = null) {
|
||||||
Logger.LogDebug("Recieved request for id {id} to randomize settings {@settings}", id, settings);
|
Logger.LogDebug("Recieved request for id {id} to randomize settings {@settings}", id, settings);
|
||||||
|
|
||||||
var args = this.GetArgs(settings);
|
var args = this.GetArgs(settings);
|
||||||
@@ -133,16 +145,26 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (mysterySettings != null) {
|
||||||
|
var mysteryJson = JsonSerializer.SerializeToDocument(mysterySettings, JsonOptions.Default);
|
||||||
|
var mysteryOut = string.Format("{0}/mystery.json", id);
|
||||||
|
await AzureStorage.UploadFile(mysteryOut, new BinaryData(mysteryJson));
|
||||||
|
}
|
||||||
|
|
||||||
if (uploadSettings) {
|
if (uploadSettings) {
|
||||||
var settingsJson = JsonSerializer.SerializeToDocument(settings, JsonOptions.Default);
|
var settingsJson = JsonSerializer.SerializeToDocument(settings, JsonOptions.Default);
|
||||||
var settingsOut = string.Format("{0}/settings.json", id);
|
var settingsOut = string.Format("{0}/settings.json", id);
|
||||||
await AzureStorage.UploadFile(settingsOut, new BinaryData(settingsJson));
|
await AzureStorage.UploadFile(settingsOut, new BinaryData(settingsJson), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task RandomizeMultiworld(string id, IList<SeedSettings> settings, bool uploadSettings = true) {
|
public async Task RandomizeMultiworld(string id, IList<SeedSettings> settings, bool uploadSettings = true) {
|
||||||
var generatorSettings = this.SettingsProcessor.GetGeneratorSettings(settings[0].Randomizer);
|
var generatorSettings = this.SettingsProcessor.GetGeneratorSettings(settings[0].Randomizer);
|
||||||
|
|
||||||
|
for (var i = 0; i < settings.Count; i++) {
|
||||||
|
settings[i].PlayerSlot = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
Logger.LogDebug("Recieved request for id {id} to randomize multiworld settings {@settings}", id, settings);
|
Logger.LogDebug("Recieved request for id {id} to randomize multiworld settings {@settings}", id, settings);
|
||||||
|
|
||||||
var names = settings.Select(s => s.PlayerName.Replace(' ', '_')).ToList();
|
var names = settings.Select(s => s.PlayerName.Replace(' ', '_')).ToList();
|
||||||
|
|||||||
@@ -5,6 +5,6 @@
|
|||||||
public interface IRandomizer {
|
public interface IRandomizer {
|
||||||
public void Validate(SeedSettings settings);
|
public void Validate(SeedSettings settings);
|
||||||
|
|
||||||
public Task Randomize(string id, SeedSettings settings, bool uploadSettings = true);
|
public Task Randomize(string id, SeedSettings settings, bool uploadSettings = true, MysterySettings? mysterySettings = null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,41 +1,25 @@
|
|||||||
namespace ALttPRandomizer {
|
namespace ALttPRandomizer {
|
||||||
using ALttPRandomizer.Serialization;
|
|
||||||
using ALttPRandomizer.Model;
|
using ALttPRandomizer.Model;
|
||||||
using ALttPRandomizer.Randomizers;
|
|
||||||
using ALttPRandomizer.Service;
|
using ALttPRandomizer.Service;
|
||||||
using ALttPRandomizer.Settings;
|
using ALttPRandomizer.Settings;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using YamlDotNet.Serialization;
|
|
||||||
using YamlDotNet.Serialization.NamingConventions;
|
|
||||||
|
|
||||||
public class SeedController : Controller {
|
public class SeedController : Controller {
|
||||||
public SeedController(
|
public SeedController(
|
||||||
RandomizeService randomizeService,
|
RandomizeService randomizeService,
|
||||||
MysteryRandomizer mysteryRandomizer,
|
|
||||||
SeedService seedService,
|
SeedService seedService,
|
||||||
ILogger<SeedController> logger) {
|
ILogger<SeedController> logger) {
|
||||||
this.RandomizeService = randomizeService;
|
this.RandomizeService = randomizeService;
|
||||||
this.MysteryRandomizer = mysteryRandomizer;
|
|
||||||
this.SeedService = seedService;
|
this.SeedService = seedService;
|
||||||
this.Logger = logger;
|
this.Logger = logger;
|
||||||
|
|
||||||
this.YamlSerializer =
|
|
||||||
new SerializerBuilder()
|
|
||||||
.WithNamingConvention(UnderscoredNamingConvention.Instance)
|
|
||||||
.WithTypeConverter(new YamlStringEnumConverter())
|
|
||||||
.WithTypeConverter(new RandomizableWeightsYamlConverters())
|
|
||||||
.ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull | DefaultValuesHandling.OmitEmptyCollections)
|
|
||||||
.Build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private RandomizeService RandomizeService { get; }
|
private RandomizeService RandomizeService { get; }
|
||||||
private MysteryRandomizer MysteryRandomizer { get; }
|
|
||||||
private SeedService SeedService { get; }
|
private SeedService SeedService { get; }
|
||||||
private ILogger<SeedController> Logger { get; }
|
private ILogger<SeedController> Logger { get; }
|
||||||
private ISerializer YamlSerializer { get; }
|
|
||||||
|
|
||||||
[Route("/generate")]
|
[Route("/generate")]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -43,6 +27,7 @@
|
|||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
return BadRequest(ModelState);
|
return BadRequest(ModelState);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var id = await this.RandomizeService.RandomizeSeed(settings);
|
var id = await this.RandomizeService.RandomizeSeed(settings);
|
||||||
var url = string.Format("/seed/{0}", id);
|
var url = string.Format("/seed/{0}", id);
|
||||||
@@ -54,15 +39,24 @@
|
|||||||
|
|
||||||
[Route("/mystery/{randomizer}")]
|
[Route("/mystery/{randomizer}")]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public ActionResult RollMystery([FromBody] MysterySettings mysterySettings, RandomizerInstance randomizer) {
|
public async Task<ObjectResult> RollMystery([FromBody] MysterySettings mysterySettings, RandomizerInstance randomizer, bool race) {
|
||||||
if (!ModelState.IsValid) {
|
if (!ModelState.IsValid) {
|
||||||
return BadRequest(ModelState);
|
return BadRequest(ModelState);
|
||||||
}
|
}
|
||||||
|
|
||||||
var seedSettings = new SeedSettings() { Randomizer = randomizer };
|
var baseSettings = new SeedSettings() {
|
||||||
this.MysteryRandomizer.Roll(mysterySettings, seedSettings);
|
Randomizer = randomizer,
|
||||||
|
Race = race ? RaceMode.Race : RaceMode.Normal,
|
||||||
|
Mystery = MysteryMode.Mystery,
|
||||||
|
};
|
||||||
|
|
||||||
return StatusCode(200, this.YamlSerializer.Serialize(mysterySettings));
|
try {
|
||||||
|
var id = await this.RandomizeService.RandomizeMystery(mysterySettings, baseSettings);
|
||||||
|
var url = string.Format("/seed/{0}", id);
|
||||||
|
return Accepted(url, id);
|
||||||
|
} catch (InvalidSettingsException ex) {
|
||||||
|
return BadRequest(ex.Message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Route("/multiworld")]
|
[Route("/multiworld")]
|
||||||
@@ -117,6 +111,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Route("/healthcheck")]
|
||||||
|
[HttpGet]
|
||||||
|
public StatusCodeResult GetHealthCheck() {
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
private ObjectResult ResolveResult(IDictionary<string, object> result) {
|
private ObjectResult ResolveResult(IDictionary<string, object> result) {
|
||||||
if (result.TryGetValue("status", out var responseCode)) {
|
if (result.TryGetValue("status", out var responseCode)) {
|
||||||
if (responseCode is int code) {
|
if (responseCode is int code) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using ALttPRandomizer.Azure;
|
using ALttPRandomizer.Azure;
|
||||||
using ALttPRandomizer.Model;
|
using ALttPRandomizer.Model;
|
||||||
using ALttPRandomizer.Randomizers;
|
using ALttPRandomizer.Randomizers;
|
||||||
|
using ALttPRandomizer.Settings;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
@@ -11,10 +12,12 @@
|
|||||||
public RandomizeService(
|
public RandomizeService(
|
||||||
IdGenerator idGenerator,
|
IdGenerator idGenerator,
|
||||||
BaseRandomizer baseRandomizer,
|
BaseRandomizer baseRandomizer,
|
||||||
|
MysteryRandomizer mysteryRandomizer,
|
||||||
AzureStorage azureStorage,
|
AzureStorage azureStorage,
|
||||||
ILogger<RandomizeService> logger) {
|
ILogger<RandomizeService> logger) {
|
||||||
this.IdGenerator = idGenerator;
|
this.IdGenerator = idGenerator;
|
||||||
this.BaseRandomizer = baseRandomizer;
|
this.BaseRandomizer = baseRandomizer;
|
||||||
|
this.MysteryRandomizer = mysteryRandomizer;
|
||||||
this.AzureStorage = azureStorage;
|
this.AzureStorage = azureStorage;
|
||||||
this.Logger = logger;
|
this.Logger = logger;
|
||||||
}
|
}
|
||||||
@@ -23,6 +26,7 @@
|
|||||||
|
|
||||||
private IdGenerator IdGenerator { get; }
|
private IdGenerator IdGenerator { get; }
|
||||||
private BaseRandomizer BaseRandomizer { get; }
|
private BaseRandomizer BaseRandomizer { get; }
|
||||||
|
private MysteryRandomizer MysteryRandomizer { get; }
|
||||||
private AzureStorage AzureStorage { get; }
|
private AzureStorage AzureStorage { get; }
|
||||||
|
|
||||||
public async Task<string> RandomizeSeed(SeedSettings settings, string? seedId = null) {
|
public async Task<string> RandomizeSeed(SeedSettings settings, string? seedId = null) {
|
||||||
@@ -35,6 +39,31 @@
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<string> RandomizeMystery(MysterySettings mysterySettings, SeedSettings baseSettings, string? seedId = null) {
|
||||||
|
var id = seedId ?? this.IdGenerator.GenerateId();
|
||||||
|
this.Logger.LogDebug("Rolling mystery seed {seedId} with mystery {@settings}", id, mysterySettings);
|
||||||
|
|
||||||
|
SeedSettings seedSettings;
|
||||||
|
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
seedSettings = baseSettings.Clone();
|
||||||
|
this.MysteryRandomizer.Roll(mysterySettings, seedSettings);
|
||||||
|
this.Logger.LogInformation("Mystery seed {seedId} rolled settings {@settings}", id, seedSettings);
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.BaseRandomizer.Validate(seedSettings);
|
||||||
|
} catch (InvalidSettingsException) {
|
||||||
|
this.Logger.LogWarning("Mystery seed {seedId} settings {@settings} failed validation; retrying", id, seedSettings);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.BaseRandomizer.Randomize(id, seedSettings, true, seedId == null ? mysterySettings : null);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InvalidSettingsException("Could not roll settings that pass validation");
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<string> RandomizeMultiworld(IList<SeedSettings> settings, string? multiId = null) {
|
public async Task<string> RandomizeMultiworld(IList<SeedSettings> settings, string? multiId = null) {
|
||||||
var id = multiId ?? this.IdGenerator.GenerateId();
|
var id = multiId ?? this.IdGenerator.GenerateId();
|
||||||
this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings);
|
this.Logger.LogInformation("Generating multiworld {seedId} with settings {@settings}", id, settings);
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal class IgnoreSettingAttribute : RandomizerSpecificAttribute {
|
internal class IgnoreSettingAttribute : RandomizerSpecificAttribute {
|
||||||
|
public IgnoreSettingAttribute() : base(null) { }
|
||||||
public IgnoreSettingAttribute(params RandomizerInstance[] randomizers) : base(randomizers) { }
|
public IgnoreSettingAttribute(params RandomizerInstance[] randomizers) : base(randomizers) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
var props = typeof(SeedSettings).GetProperties(BindingFlags.Instance | BindingFlags.Public);
|
var props = typeof(SeedSettings).GetProperties(BindingFlags.Instance | BindingFlags.Public);
|
||||||
var starting = new List<string>();
|
var starting = new List<string>();
|
||||||
foreach (var prop in props) {
|
foreach (var prop in props) {
|
||||||
if (prop.Name == nameof(SeedSettings.PlayerName)) {
|
if (prop.GetCustomAttributes<IgnoreSettingAttribute>().Any(att => att.HasRandomizer(randomizer))) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,10 +19,6 @@
|
|||||||
var fi = prop.PropertyType.GetField(valueFieldName, BindingFlags.Static | BindingFlags.Public)
|
var fi = prop.PropertyType.GetField(valueFieldName, BindingFlags.Static | BindingFlags.Public)
|
||||||
?? throw new SettingsLookupException("Could not get field info for value {0}.{1}", prop.PropertyType, valueFieldName);
|
?? throw new SettingsLookupException("Could not get field info for value {0}.{1}", prop.PropertyType, valueFieldName);
|
||||||
|
|
||||||
if (prop.GetCustomAttributes<IgnoreSettingAttribute>().Any(att => att.HasRandomizer(randomizer))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!prop.GetCustomAttributes<NoSettingNameAttribute>().Any(att => att.HasRandomizer(randomizer))) {
|
if (!prop.GetCustomAttributes<NoSettingNameAttribute>().Any(att => att.HasRandomizer(randomizer))) {
|
||||||
var settingName =
|
var settingName =
|
||||||
prop.GetCustomAttributes<SettingNameAttribute>()
|
prop.GetCustomAttributes<SettingNameAttribute>()
|
||||||
|
|||||||
@@ -5,10 +5,9 @@
|
|||||||
"allowedCors": [
|
"allowedCors": [
|
||||||
"https://new.alttpr.gwaa.kiwi",
|
"https://new.alttpr.gwaa.kiwi",
|
||||||
"https://api.alttpr.gwaa.kiwi",
|
"https://api.alttpr.gwaa.kiwi",
|
||||||
"http://localhost:8082"
|
"http://localhost:8082",
|
||||||
],
|
],
|
||||||
"azureSettings": {
|
"azureSettings": {
|
||||||
"clientId": "a48d5ae1-fa0a-4e33-9586-18c0eca0a28c",
|
|
||||||
"blobstoreEndpoint": "https://alttprstorage.blob.core.windows.net/seeds"
|
"blobstoreEndpoint": "https://alttprstorage.blob.core.windows.net/seeds"
|
||||||
},
|
},
|
||||||
"generators": {
|
"generators": {
|
||||||
|
|||||||
+1
-1
Submodule BaseRandomizer updated: 7bab5b0434...c0c177dfed
+1
-1
Submodule BetaRandomizer updated: cd5bc9a206...e77bb2980b
+1
-1
Submodule PikitRandomizer updated: be35ed4451...1d4a77b8e7
@@ -0,0 +1,25 @@
|
|||||||
|
set dotenv-filename := ".env.just"
|
||||||
|
|
||||||
|
import? "local.just"
|
||||||
|
|
||||||
|
[private]
|
||||||
|
@list:
|
||||||
|
just --list --list-submodules --unsorted
|
||||||
|
|
||||||
|
# Build docker image
|
||||||
|
[group("docker")]
|
||||||
|
[arg("TAG", long="tag", short="t")]
|
||||||
|
build VERSION="latest" TAG=env("DOCKER_TAG"):
|
||||||
|
DOCKER_BUILDKIT=1 docker build . --progress=plain -t {{TAG}}:{{VERSION}}
|
||||||
|
|
||||||
|
# Run docker image
|
||||||
|
[group("docker")]
|
||||||
|
[arg("TAG", long="tag", short="t")]
|
||||||
|
run VERSION="latest" TAG=env("DOCKER_TAG"): (build VERSION TAG)
|
||||||
|
docker run -p 5000:8080 {{TAG}}:{{VERSION}}
|
||||||
|
|
||||||
|
# Push docker image to registry
|
||||||
|
[group("docker")]
|
||||||
|
[arg("TAG", long="tag", short="t")]
|
||||||
|
push VERSION="latest" TAG=env("DOCKER_TAG"): (build VERSION TAG)
|
||||||
|
docker push {{TAG}}:{{VERSION}}
|
||||||
Reference in New Issue
Block a user