Exemplo n.º 1
0
        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
        }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
 public IConnectionChannel CreateChannel(byte channel, IDispatcher <IConnectionSession> dispatcher, JsonMessageFactory factory, Func <IConnectionSession, bool> shouldOpen)
 {
     return(RegisterChannel(connection.CreateChannel(channel), dispatcher, factory, shouldOpen));
 }
Exemplo n.º 5
0
        // 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);
        }
Exemplo n.º 6
0
 public WebSocketServerService(WebSocketServer server, JsonMessageFactory factory)
 {
     Logger       = new LoggerAdapter(Name);
     this.server  = server;
     this.factory = factory;
 }