public override async Task <SubmitGameEventResponse> SubmitGameEvent(SubmitGameEventRequest request, ServerCallContext context)
        {
            DbUserModel dbUserModel = context.UserState["user"] as DbUserModel;

            if (dbUserModel == null)
            {
                return new SubmitGameEventResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.UNAUTHORIZED)
                       }
            }
            ;

            Room room = await Room.GetRoomFromGuid(request.RoomId);

            if (room == null)
            {
                return new SubmitGameEventResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.ROOM_DOES_NOT_EXIST)
                       }
            }
            ;

            if (!room.IsPlayerInRoom(dbUserModel))
            {
                return new SubmitGameEventResponse()
                       {
                           Status = ResponseFactory.createResponse(ResponseType.PERMISSION_DENIED)
                       }
            }
            ;

            return(await room.AddPlayerGameEvent(dbUserModel, request.EventData));
        }
        public void PlayersCanViewAnyEventThatHasAlreadyOccurred()
        {
            // Submit 3 close game events, and 2 far game events.
            SubmitGameEventRequest request = new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 5,
                },
                RoomId = gameId,
            };

            client.SubmitGameEvent(request);
            client.SubmitGameEvent(request);
            client.SubmitGameEvent(request);

            request.EventData.OccursAtTick = 10467;

            client.SubmitGameEvent(request);
            client.SubmitGameEvent(request);

            Thread.Sleep(5000);

            // Submitting player can see their own events
            GetGameRoomEventsResponse gameEventsForSubmitter = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEventsForSubmitter.Status.IsSuccess, true);
            Assert.AreEqual(5, gameEventsForSubmitter.GameEvents.Count);

            authHelper.loginToAccount(playerTwoInGame);
            // Other player can only see events that have passed.
            GetGameRoomEventsResponse gameEventsForOther = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId
            });

            Assert.AreEqual(gameEventsForOther.Status.IsSuccess, true);
            Assert.AreEqual(3, gameEventsForOther.GameEvents.Count);
        }
        public void AdminsCanSeeAllGameEvents()
        {
            // Submit 3 close game events, and 2 far game events.
            SubmitGameEventRequest request = new SubmitGameEventRequest()
            {
                EventData = new GameEventRequest()
                {
                    EventData    = ByteString.CopyFromUtf8("MyEventData"),
                    OccursAtTick = 123,
                },
                RoomId = gameId,
            };

            client.SubmitGameEvent(request);
            client.SubmitGameEvent(request);
            client.SubmitGameEvent(request);

            request.EventData.OccursAtTick = 10467;

            client.SubmitGameEvent(request);
            client.SubmitGameEvent(request);

            SuperUser admin = authHelper.CreateSuperUser();

            client.Login(new AuthorizationRequest()
            {
                Username = admin.DbUserModel.UserModel.Username,
                Password = admin.password,
            });

            GetGameRoomEventsResponse eventResponse = client.GetGameRoomEvents(new GetGameRoomEventsRequest()
            {
                RoomId = gameId,
            });

            Assert.AreEqual(eventResponse.Status.IsSuccess, true);

            // Admin should be able to see all 5 events!
            Assert.AreEqual(5, eventResponse.GameEvents.Count);
        }