New high performance.
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Aiursoft.Scanner" Version="7.0.1" />
|
||||
<PackageReference Include="Aiursoft.WebTools" Version="7.0.22" />
|
||||
<PackageReference Include="Aiursoft.WebTools" Version="7.0.23" />
|
||||
<PackageReference Include="Gera.Chess" Version="1.0.5" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -32,7 +32,7 @@ public class GamesController : Controller
|
||||
}
|
||||
|
||||
[Route("{id:int}.ws")]
|
||||
public async Task GetWebSocket([FromRoute] int id)
|
||||
public async Task GetWebSocket([FromRoute] int id, [FromQuery]string player)
|
||||
{
|
||||
var pusher = await HttpContext.AcceptWebSocketClient();
|
||||
var game = _database.GetOrAddGame(id);
|
||||
@@ -40,18 +40,14 @@ public class GamesController : Controller
|
||||
.FenChangedChannel
|
||||
.Subscribe(t => pusher.Send(t, HttpContext.RequestAborted));
|
||||
|
||||
var inSub = pusher.Subscribe(async message =>
|
||||
var inSub = pusher
|
||||
.Filter(t => !string.IsNullOrWhiteSpace(t))
|
||||
.Subscribe(async move =>
|
||||
{
|
||||
if (message.Length < 2)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var player = message[..1];
|
||||
var move = message[1..];
|
||||
lock (game.MovePieceLock)
|
||||
{
|
||||
if (game.Board.IsValidMove(move) && !game.Board.IsEndGame &&
|
||||
if (!game.Board.IsEndGame &&
|
||||
game.Board.IsValidMove(move) &&
|
||||
game.Board.Turn.AsChar.ToString() == player)
|
||||
{
|
||||
game.Board.Move(move);
|
||||
@@ -71,8 +67,8 @@ public class GamesController : Controller
|
||||
finally
|
||||
{
|
||||
await pusher.Close(HttpContext.RequestAborted);
|
||||
outSub.UnRegister();
|
||||
inSub.UnRegister();
|
||||
outSub.Unsubscribe();
|
||||
inSub.Unsubscribe();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ const initGameBoard = function (player, gameId) {
|
||||
let game = null;
|
||||
const wsScheme = window.location.protocol === "https:" ? "wss://" : "ws://";
|
||||
const socket = new WebSocket(
|
||||
`${wsScheme}${window.location.host}/games/${gameId}.ws`
|
||||
`${wsScheme}${window.location.host}/games/${gameId}.ws?player=${player}`
|
||||
);
|
||||
|
||||
function onDragStart(source, piece, position, _) {
|
||||
@@ -36,7 +36,7 @@ const initGameBoard = function (player, gameId) {
|
||||
return "snapback";
|
||||
}
|
||||
const lastMove = game.history({verbose: true}).pop().san;
|
||||
socket.send(player + lastMove);
|
||||
socket.send(lastMove);
|
||||
} catch (e) {
|
||||
return "snapback";
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Aiursoft.CSTools.Tools;
|
||||
using Aiursoft.AiurObserver;
|
||||
using Aiursoft.CSTools.Tools;
|
||||
using Aiursoft.WebTools.Services;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
@@ -64,13 +65,14 @@ public class BasicTests
|
||||
[DataRow("/games/4/move/w/Nc3")]
|
||||
public async Task MoveChess(string url)
|
||||
{
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{url.Split("/")[2]}.ws";
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{url.Split("/")[2]}.ws?player={url.Split("/")[4]}";
|
||||
var socket = await endPoint.ConnectAsWebSocketServer();
|
||||
var socketStage = socket.StageLast();
|
||||
await Task.Factory.StartNew(() => socket.Listen());
|
||||
|
||||
await socket.Send(url.Split("/")[4] + url.Split("/")[5]);
|
||||
await socket.Send(url.Split("/")[5]);
|
||||
await Task.Delay(150);
|
||||
Assert.IsTrue(!string.IsNullOrWhiteSpace(socket.LastMessage));
|
||||
Assert.IsTrue(!string.IsNullOrWhiteSpace(socketStage.Stage));
|
||||
await socket.Close();
|
||||
}
|
||||
|
||||
@@ -79,15 +81,16 @@ public class BasicTests
|
||||
[DataRow("/games/6/move/b/O-O-O")]
|
||||
public async Task InvalidMoveChess(string url)
|
||||
{
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{url.Split("/")[2]}.ws";
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{url.Split("/")[2]}.ws?player={url.Split("/")[4]}";
|
||||
var socket = await endPoint.ConnectAsWebSocketServer();
|
||||
var socketStage = socket.StageLast();
|
||||
await Task.Factory.StartNew(() => socket.Listen());
|
||||
|
||||
await socket.Send(url.Split("/")[4] + url.Split("/")[5]);
|
||||
await socket.Send(url.Split("/")[5]);
|
||||
await Task.Delay(150);
|
||||
|
||||
// fen equal init
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", socket.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", socketStage.Stage);
|
||||
await socket.Close();
|
||||
}
|
||||
|
||||
@@ -97,17 +100,14 @@ public class BasicTests
|
||||
[DataRow(9)]
|
||||
public async Task TestConnect(int gameId)
|
||||
{
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{gameId}.ws";
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{gameId}.ws?player=w";
|
||||
var socket = await endPoint.ConnectAsWebSocketServer();
|
||||
var socketStage = socket.StageLast();
|
||||
await Task.Factory.StartNew(() => socket.Listen());
|
||||
|
||||
await socket.Send("we4");
|
||||
await socket.Send("e4");
|
||||
await Task.Delay(150);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", socket.LastMessage);
|
||||
|
||||
await socket.Send("be5");
|
||||
await Task.Delay(150);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", socketStage.Stage);
|
||||
|
||||
await socket.Close();
|
||||
}
|
||||
@@ -117,33 +117,38 @@ public class BasicTests
|
||||
[DataRow(11)]
|
||||
public async Task TestGameWithReconnection(int gameId)
|
||||
{
|
||||
var endPoint = _endpointUrl.Replace("http", "ws") + $"/games/{gameId}.ws";
|
||||
var socket1 = await endPoint.ConnectAsWebSocketServer();
|
||||
var socket1 = await (_endpointUrl.Replace("http", "ws") + $"/games/{gameId}.ws?player=w")
|
||||
.ConnectAsWebSocketServer();
|
||||
var socket1Stage = socket1.StageLast();
|
||||
await Task.Factory.StartNew(() => socket1.Listen());
|
||||
|
||||
var socket2 = await endPoint.ConnectAsWebSocketServer();
|
||||
var socket2 = await (_endpointUrl.Replace("http", "ws") + $"/games/{gameId}.ws?player=b")
|
||||
.ConnectAsWebSocketServer();
|
||||
var socket2Stage = socket2.StageLast();
|
||||
await Task.Factory.StartNew(() => socket2.Listen());
|
||||
|
||||
await socket1.Send("we4");
|
||||
await socket1.Send("e4");
|
||||
await Task.Delay(150);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", socket1.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", socket2.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", socket1Stage.Stage);
|
||||
Assert.AreEqual("rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1", socket2Stage.Stage);
|
||||
|
||||
await socket2.Send("be5");
|
||||
await socket2.Send("e5");
|
||||
await Task.Delay(150);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket1.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket2.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket1Stage.Stage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket2Stage.Stage);
|
||||
|
||||
await socket1.Close();
|
||||
|
||||
var socket3 = await endPoint.ConnectAsWebSocketServer();
|
||||
|
||||
var socket3 = await (_endpointUrl.Replace("http", "ws") + $"/games/{gameId}.ws?player=w")
|
||||
.ConnectAsWebSocketServer();
|
||||
var socket3Stage = socket3.StageLast();
|
||||
await Task.Factory.StartNew(() => socket3.Listen());
|
||||
|
||||
await socket3.Send("wNf3");
|
||||
await socket3.Send("Nf3");
|
||||
await Task.Delay(150);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket1.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2", socket2.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2", socket3.LastMessage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR w KQkq e6 0 2", socket1Stage.Stage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2", socket2Stage.Stage);
|
||||
Assert.AreEqual("rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - 1 2", socket3Stage.Stage);
|
||||
|
||||
await socket3.Close();
|
||||
await socket2.Close();
|
||||
|
||||
Reference in New Issue
Block a user