public void Move(Guid gameId, int row, int col) { // TODO: exceptions in following invocation are silently lost, so we need a way to log and show them. Action move = () => { /* * Here instance members are out of lifetime scope setup by Autofac because of delayed invocation * TODO: use ServiceLocator to instantiate them? */ using (var repository = new EFRepository(new ApplicationDbContext())) { var messageFactory = new JsonMessageFactory(); var game = repository.GetGame(gameId); var snapshot = repository.GetGameSnapshot(game); game.Move(_player, row, col); PlayerRole playerRole = game.GetPlayerRole(_player); var message = messageFactory.CreateMovedMessage(gameId, playerRole, row, col, game.CurrentState); repository.AddMessage(message); snapshot.LastMessage = message; repository.Save(); } }; MoveRequests.AddOrUpdate(gameId, id => Task.Factory.StartNew(move), // on first call run for this gameId (id, currentTask) => currentTask.ContinueWith(t => move())); // queue invocation for this gameId }
public ConnectionChannel(IChannel channel, JsonMessageFactory factory, IDispatcher <IConnectionSession> dispatcher, Func <IConnectionSession, bool> shouldOpen, ILogger messageLogger) { this.Factory = factory; this.Dispatcher = dispatcher; this.shouldOpen = shouldOpen; this.messageLogger = messageLogger; Channel = channel; }
public void Poll_for_creating_player_should_return_join_message_when_game_is_locked() { // Arrange const int width = 100; const int height = 50; var user = Substitute.For <IPrincipal>(); user.Identity.IsAuthenticated.Returns(true); var player1 = new Player(1); var player2 = new Player(2); var game = new Game(width, height, player1); var games = new List <Game> { game }.AsQueryable(); var repository = Substitute.For <IRepository>(); repository.Games.Returns(games); var jsonMessageFactory = new JsonMessageFactory(); var messages = new List <Message>(); repository.AddMessage(Arg.Do <Message>(messages.Add)); repository.PollMessages(Arg.Any <Guid?>(), Arg.Any <int?>(), Arg.Any <int>()).Returns(messages); // Act (locking player) repository.FindPlayer(Arg.Any <string>()).Returns(player2); var controller2 = new GameController(user, repository, jsonMessageFactory); controller2.Show(game.Id); // locks game to player2 // Act (polling player) repository.FindPlayer(Arg.Any <string>()).Returns(player1); var controller1 = new MessageController(user, repository); var pollResult = controller1.Poll(game.Id); // Assert dynamic jsonMessages = pollResult.Data; var firstMessage = messages.First(); Assert.AreEqual(new { id = firstMessage.Id, name = firstMessage.Name, content = firstMessage.Content }.ToString(), jsonMessages[0].ToString()); }
public IConnectionChannel CreateChannel(byte channel, IDispatcher <IConnectionSession> dispatcher, JsonMessageFactory factory, Func <IConnectionSession, bool> shouldOpen) { return(RegisterChannel(connection.CreateChannel(channel), dispatcher, factory, shouldOpen)); }
// link channel to dispatcher private IConnectionChannel RegisterChannel(IChannel channel, IDispatcher <IConnectionSession> dispatcher, JsonMessageFactory factory, Func <IConnectionSession, bool> shouldOpen) { dispatchers.Add(dispatcher); var connectionChannel = new ConnectionChannel(channel, factory, dispatcher, shouldOpen, MessageLogger); connection.OnConnected(session => OnSessionConnected(session, connectionChannel)); connectionChannel.OnReceived((session, bytes) => OnReceive(connectionChannel, new ConnectionSession(session), bytes)); return(connectionChannel); }
public WebSocketServerService(WebSocketServer server, JsonMessageFactory factory) { Logger = new LoggerAdapter(Name); this.server = server; this.factory = factory; }