Ui/MainMenu.razor.cs
using System;
using System.Collections;
using System.IO;
using System.Text.Json;
using Clover.Player;

namespace Clover.Ui;

public partial class MainMenu
{
	public enum MenuState
	{
		Title,
		SelectRealm,
		CreateRealm,
		Settings,
		About,
	}

	public MenuState State { get; set; } = MenuState.Title;

	public List<RealmManager.RealmInfo> Realms { get; set; } = new();

	public void SetState( MenuState state )
	{
		State = state;
	}


	protected override void OnStart()
	{
		FileSystem.Data.CreateDirectory( "realms" );
		var folders = FileSystem.Data.FindDirectory( "realms" );

		foreach ( var folder in folders )
		{
			var path = $"realms/{folder}";

			if ( !FileSystem.Data.FileExists( $"{path}/.realminfo" ) )
			{
				Log.Warning( $"Realm folder {folder} is missing .realminfo file" );
				var json1 = new RealmManager.RealmInfo { Id = folder, Name = folder, Created = DateTime.Now };
				FileSystem.Data.WriteAllText( $"{path}/.realminfo", JsonSerializer.Serialize( json1,
					GameManager.JsonOptions ) );
			}

			var json = JsonSerializer.Deserialize<RealmManager.RealmInfo>(
				FileSystem.Data.ReadAllText( $"{path}/.realminfo" ),
				GameManager.JsonOptions );

			Realms.Add( json );
		}
	}

	private string _newRealmName = "";

	private void CreateRealm()
	{
		var invalid = Path.GetInvalidPathChars();
		var folder_name = invalid.Aggregate( _newRealmName, ( current, c ) => current.Replace( c, '_' ) );

		if ( string.IsNullOrWhiteSpace( folder_name ) )
		{
			Log.Error( "Realm name cannot be empty" );
			return;
		}

		var path = $"realms/{folder_name}";

		if ( FileSystem.Data.DirectoryExists( path ) )
		{
			Log.Error( $"Realm {folder_name} already exists" );
			return;
		}

		FileSystem.Data.CreateDirectory( path );

		var json = new RealmManager.RealmInfo { Id = folder_name, Name = _newRealmName, Created = DateTime.Now };
		// FileSystem.Data.WriteJson( $"{path}/.realminfo", json );
		json.Save();

		Realms.Add( json );

		_newRealmName = "";

		SetState( MenuState.SelectRealm );
	}

	private void SelectRealm( RealmManager.RealmInfo realm )
	{
		Log.Info( $"Selected realm: {realm.Name}" );

		PlayerCharacter.SpawnPlayerId = null;
		RealmManager.CurrentRealm = realm;

		realm.LastPlayed = DateTime.Now;
		realm.Save();

		GameManager.LoadRealm();
	}
}