Refactor code for better readability and efficiency

The changes primarily focus on simplifying constructors to increase readability. This is done by organizing class properties and functions in a more efficient manner. In addition, strings are accessed using indexing rather than substrings - a technique that enhances execution speed. Not only does this change clarify the controllers and classes, but also significantly improves the overall code quality and efficiency.
This commit is contained in:
Anduin Xue
2024-02-19 09:23:23 +00:00
parent 4a70a611e4
commit 9bc85ed98c
7 changed files with 53 additions and 108 deletions
@@ -8,27 +8,19 @@ using Aiursoft.AiurObserver.Extensions;
namespace Aiursoft.ChessServer.Controllers;
[Route("games")]
public class GamesController : Controller
public class GamesController(InMemoryDatabase database) : Controller
{
private readonly InMemoryDatabase _database;
public GamesController(
InMemoryDatabase database)
{
_database = database;
}
[Route("")]
public IActionResult GetAll()
{
var games = _database.GetActiveGames();
var games = database.GetActiveGames();
return Ok(games);
}
[Route("{id:int}.json")]
public IActionResult GetInfo([FromRoute] int id)
{
var game = _database.GetOrAddGame(id);
var game = database.GetOrAddGame(id);
return Ok(new GameContext(game, id));
}
@@ -36,7 +28,7 @@ public class GamesController : Controller
public async Task GetWebSocket([FromRoute] int id, [FromQuery]string player)
{
var pusher = await HttpContext.AcceptWebSocketClient();
var game = _database.GetOrAddGame(id);
var game = database.GetOrAddGame(id);
var outSub = game
.FenChangedChannel
.Subscribe(t => pusher.Send(t, HttpContext.RequestAborted));
@@ -76,7 +68,7 @@ public class GamesController : Controller
[Route("{id:int}.ascii")]
public IActionResult GetAscii([FromRoute] int id)
{
var game = _database.GetOrAddGame(id);
var game = database.GetOrAddGame(id);
return Ok(game.Board.ToAscii());
}
@@ -89,14 +81,14 @@ public class GamesController : Controller
[Route("{id:int}.fen")]
public IActionResult GetFen([FromRoute] int id)
{
var game = _database.GetOrAddGame(id);
var game = database.GetOrAddGame(id);
return Ok(game.Board.ToFen());
}
[Route("{id:int}.pgn")]
public IActionResult GetPgn([FromRoute] int id)
{
var game = _database.GetOrAddGame(id);
var game = database.GetOrAddGame(id);
return Ok(game.Board.ToPgn());
}
}
@@ -8,25 +8,16 @@ using Microsoft.AspNetCore.Mvc;
namespace Aiursoft.ChessServer.Controllers;
public class HomeController : Controller
public class HomeController(
Counter counter,
InMemoryDatabase database) : Controller
{
private readonly Counter _counter;
private readonly InMemoryDatabase _database;
public HomeController(
Counter counter,
InMemoryDatabase database)
{
_counter = counter;
_database = database;
}
[HttpGet]
public IActionResult Index()
{
var model = new IndexViewModel
{
Challenges = _database.GetPublicChallenges()
Challenges = database.GetPublicChallenges()
};
return View(model);
}
@@ -44,14 +35,14 @@ public class HomeController : Controller
public IActionResult Auto(Guid playerId)
{
// I created a challenge. Go to my challenge.
var myChallengeKey = _database.GetMyChallengeKey(playerId);
var myChallengeKey = database.GetMyChallengeKey(playerId);
if (myChallengeKey != null)
{
return RedirectToAction(nameof(Challenge), new { id = (int)myChallengeKey, playerId });
}
// Exists a public challenge. Go to that challenge.
var otherChallenge = _database.GetFirstPublicChallengeKey();
var otherChallenge = database.GetFirstPublicChallengeKey();
if (otherChallenge != null)
{
return RedirectToAction(nameof(Challenge), new { id = (int)otherChallenge, playerId });
@@ -71,7 +62,7 @@ public class HomeController : Controller
[HttpGet]
public IActionResult Create(Guid playerId)
{
var myChallengeKey = _database.GetMyChallengeKey(playerId);
var myChallengeKey = database.GetMyChallengeKey(playerId);
if (myChallengeKey != null)
{
return RedirectToAction(nameof(Challenge), new { id = myChallengeKey, playerId });
@@ -84,7 +75,7 @@ public class HomeController : Controller
public IActionResult Create(CreateChallengeViewModel model)
{
// Ensure single challenge can be created by a player.
var myChallengeKey = _database.GetMyChallengeKey(model.CreatorId);
var myChallengeKey = database.GetMyChallengeKey(model.CreatorId);
if (myChallengeKey != null)
{
ModelState.AddModelError(nameof(model.CreatorId), "You already have a challenge!");
@@ -95,7 +86,7 @@ public class HomeController : Controller
}
// Create a new challenge.
var player = _database.GetOrAddPlayer(model.CreatorId);
var player = database.GetOrAddPlayer(model.CreatorId);
var challenge = new Challenge(player)
{
RoleRule = model.RoleRule,
@@ -103,8 +94,8 @@ public class HomeController : Controller
Permission = model.Permission,
TimeLimit = model.TimeLimit,
};
var challengeId = _counter.GetUniqueNo();
_database.CreateChallenge(challengeId, challenge);
var challengeId = counter.GetUniqueNo();
database.CreateChallenge(challengeId, challenge);
return RedirectToAction(nameof(Challenge), new { id = challengeId });
}
@@ -120,7 +111,7 @@ public class HomeController : Controller
[HttpGet]
public IActionResult Challenge(int id)
{
var challenge = _database.GetChallenge(id);
var challenge = database.GetChallenge(id);
if (challenge == null)
{
// Challenge not found.
@@ -140,10 +131,10 @@ public class HomeController : Controller
{
return RedirectToAction(nameof(Challenge), new { id = model.Id, playerId = model.PlayerId });
}
var challenge = _database.GetChallenge(model.Id);
var challenge = database.GetChallenge(model.Id);
if (challenge != null && challenge.Creator.Id == model.PlayerId)
{
_database.DeleteChallenge(model.Id);
database.DeleteChallenge(model.Id);
}
return RedirectToAction(nameof(Index));
}
@@ -151,7 +142,7 @@ public class HomeController : Controller
public async Task ListenChallenge(int id)
{
var pusher = await HttpContext.AcceptWebSocketClient();
var challenge = _database.GetChallenge(id);
var challenge = database.GetChallenge(id);
if (challenge == null)
{
return;
@@ -6,19 +6,12 @@ using Microsoft.AspNetCore.Mvc;
namespace Aiursoft.ChessServer.Controllers;
[Route("players")]
public class PlayersController : ControllerBase
public class PlayersController(InMemoryDatabase database) : ControllerBase
{
private readonly InMemoryDatabase _database;
public PlayersController(InMemoryDatabase database)
{
_database = database;
}
[Route("{id:guid}")]
public IActionResult Me([Required]Guid id)
{
var me = _database.GetOrAddPlayer(id);
var me = database.GetOrAddPlayer(id);
return Ok(me);
}
@@ -31,7 +24,7 @@ public class PlayersController : ControllerBase
return BadRequest();
}
var me = _database.GetOrAddPlayer(id);
var me = database.GetOrAddPlayer(id);
me.NickName = nickname;
return Ok();
}
@@ -1,25 +1,18 @@
namespace Aiursoft.ChessServer.Middlewares
{
public class AllowCrossOriginMiddleware
public class AllowCrossOriginMiddleware(RequestDelegate next)
{
private readonly RequestDelegate _next;
public AllowCrossOriginMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Path.ToString().StartsWith("/games/img"))
{
context.Request.Path = context.Request.Path.ToString().Substring("/games".Length);
context.Request.Path = context.Request.Path.ToString()["/games".Length..];
}
var origin = context.Request.Headers["Origin"].ToString();
var origin = context.Request.Headers.Origin.ToString();
if (string.IsNullOrEmpty(origin))
{
await _next.Invoke(context);
await next.Invoke(context);
return;
}
@@ -34,7 +27,7 @@
return;
}
await _next.Invoke(context);
await next.Invoke(context);
}
}
}
+2 -7
View File
@@ -2,14 +2,9 @@ using Aiursoft.AiurObserver;
namespace Aiursoft.ChessServer.Models;
public class Challenge
public class Challenge(Player creator)
{
public Challenge(Player creator)
{
Creator = creator;
}
public Player Creator { get; set; }
public Player Creator { get; set; } = creator;
public string Message { get; set; } = "A chess room.";
public Player? Accepter { get; set; } = null;
+3 -8
View File
@@ -1,13 +1,8 @@
namespace Aiursoft.ChessServer.Models;
public class Player
public class Player(Guid id)
{
public Guid Id { get; }
public Player(Guid id)
{
Id = id;
}
public Guid Id { get; } = id;
public string NickName { get; set; } = "Anonymous";
}
@@ -2,39 +2,25 @@
namespace Aiursoft.ChessServer.Models.ViewModels;
public class GameContext
public class GameContext(Game game, int id)
{
public GameContext(Game game, int id)
public int Id { get; } = id;
public Dictionary<string, string> Links { get; } = new()
{
Id = id;
Turn = game.Board.Turn.AsChar;
Ended = game.Board.IsEndGame;
End = game.Board.EndGame?.EndgameType;
Won = game.Board.EndGame?.WonSide;
MoveIndex = game.Board.MoveIndex;
WhiteKingChecked = game.Board.WhiteKingChecked;
BlackKingChecked = game.Board.BlackKingChecked;
Links = new Dictionary<string, string>
{
{ "ascii", $"games/{id}.ascii" },
{ "fen", $"games/{id}.fen" },
{ "pgn", $"games/{id}.pgn" },
{ "html", $"games/{id}.html" },
{ "websocket", $"games/{id}.ws" },
{ "move-post", $"games/{id}/move/{{player}}/{{move_algebraic_notation}}" }
};
Listeners = game.FenChangedChannel.GetListenerCount();
}
{ "ascii", $"games/{id}.ascii" },
{ "fen", $"games/{id}.fen" },
{ "pgn", $"games/{id}.pgn" },
{ "html", $"games/{id}.html" },
{ "websocket", $"games/{id}.ws" },
{ "move-post", $"games/{id}/move/{{player}}/{{move_algebraic_notation}}" }
};
public int Id { get; }
public Dictionary<string, string> Links { get; }
public char Turn { get; }
public bool Ended { get; }
public EndgameType? End { get; }
public PieceColor? Won { get; }
public int MoveIndex { get; }
public bool WhiteKingChecked { get; }
public bool BlackKingChecked { get; }
public int Listeners { get; }
public char Turn { get; } = game.Board.Turn.AsChar;
public bool Ended { get; } = game.Board.IsEndGame;
public EndgameType? End { get; } = game.Board.EndGame?.EndgameType;
public PieceColor? Won { get; } = game.Board.EndGame?.WonSide;
public int MoveIndex { get; } = game.Board.MoveIndex;
public bool WhiteKingChecked { get; } = game.Board.WhiteKingChecked;
public bool BlackKingChecked { get; } = game.Board.BlackKingChecked;
public int Listeners { get; } = game.FenChangedChannel.GetListenerCount();
}