public override IEnumerator ExecuteRequest()
        {
            // Create the move request
            var request = new ExecuteFunctionRequest
            {
                FunctionName      = Constants.PLAYER_MOVE_FUNCTION_NAME,
                FunctionParameter = new MakePlayerMoveRequest
                {
                    PlayFabId = Player.PlayFabId,
                    Move      = MoveToExecute
                },
                AuthenticationContext = new PlayFabAuthenticationContext
                {
                    EntityToken = Player.EntityToken
                }
            };

            // Execute the move request
            PlayFabCloudScriptAPI.ExecuteFunction(request,
                                                  (result) =>
            {
                ExecutionCompleted = true;
                MoveResult         = PlayFabSimpleJson.DeserializeObject <MakePlayerMoveResult>(result.FunctionResult.ToString());
            },
                                                  (error) =>
            {
                throw new Exception($"MakePlayerMove request failed. Message: {error.ErrorMessage}, Code: {error.HttpCode}");
            });

            yield return(WaitForExecution());
        }
예제 #2
0
        public override IEnumerator ExecuteRequest()
        {
            // Create the reset request
            var request = new ExecuteFunctionRequest
            {
                FunctionName      = Constants.RESET_GAME_STATE_FUNCTION_NAME,
                FunctionParameter = new PlayFabIdRequest
                {
                    PlayFabId = Player.PlayFabId
                },
                AuthenticationContext = new PlayFabAuthenticationContext
                {
                    EntityToken = Player.EntityToken
                }
            };

            // Execute the reset request
            PlayFabCloudScriptAPI.ExecuteFunction(request,
                                                  (result) =>
            {
                ExecutionCompleted = true;
            },
                                                  (error) =>
            {
                throw new Exception($"ResetGameState request failed. Message: {error.ErrorMessage}, Code: {error.HttpCode}");
            });

            yield return(WaitForExecution());
        }
        public override IEnumerator ExecuteRequest()
        {
            var request = new ExecuteFunctionRequest
            {
                FunctionName      = Constants.WIN_CHECK_FUNCTION_NAME,
                FunctionParameter = new PlayFabIdRequest
                {
                    PlayFabId = Player.PlayFabId
                },
                AuthenticationContext = new PlayFabAuthenticationContext
                {
                    EntityToken = Player.EntityToken
                }
            };

            PlayFabCloudScriptAPI.ExecuteFunction(request,
                                                  (result) =>
            {
                ExecutionCompleted = true;
                WinCheckResult     = PlayFabSimpleJson.DeserializeObject <WinCheckResult>(result.FunctionResult.ToString());
            },
                                                  (error) =>
            {
                throw new Exception($"WinCheck request failed. Message: ${error.ErrorMessage}, Code: ${error.HttpCode}");
            });

            yield return(WaitForExecution());
        }
예제 #4
0
        /// <summary>
        /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of
        /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything.
        /// </summary>
        public static void ExecuteFunction(ExecuteFunctionRequest request, Action <ExecuteFunctionResult> resultCallback,
                                           Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            var context      = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer;
            var callSettings = PlayFabSettings.staticSettings;

            if (!context.IsEntityLoggedIn())
            {
                throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method");
            }

            var localApiServerString = PlayFabSettings.LocalApiServer;

            if (!string.IsNullOrEmpty(localApiServerString))
            {
                var baseUri = new Uri(localApiServerString);
                var fullUri = new Uri(baseUri, "/CloudScript/ExecuteFunction".TrimStart('/'));
                PlayFabHttp.MakeApiCallWithFullUri(fullUri.AbsoluteUri, request, AuthType.EntityToken, resultCallback,
                                                   errorCallback, customData, extraHeaders, context, callSettings);
                return;
            }

            PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback,
                                    errorCallback, customData, extraHeaders, context, callSettings);
        }
        /// <summary>
        /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of
        /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything.
        /// </summary>
        public void ExecuteFunction(ExecuteFunctionRequest request, Action <ExecuteFunctionResult> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            var context      = (request == null ? null : request.AuthenticationContext) ?? authenticationContext;
            var callSettings = apiSettings ?? PlayFabSettings.staticSettings;

            if (!context.IsEntityLoggedIn())
            {
                throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method");
            }
            PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this);
        }
예제 #6
0
        private static void SendChatMessage(string targetPlayer, string message)
        {
            // Sending a chat message is a simple Azure Function execution where we pass in the target player and message.
            var sendChatRequest = new ExecuteFunctionRequest()
            {
                FunctionName            = "SendChatMessage",
                FunctionParameter       = new { TargetPlayer = targetPlayer, Message = message },
                GeneratePlayStreamEvent = true
            };

            PlayFabCloudScriptAPI.ExecuteFunctionAsync(sendChatRequest);
        }
예제 #7
0
        /// <summary>
        /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of
        /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything.
        /// </summary>
        public static void ExecuteFunction(ExecuteFunctionRequest request, Action <ExecuteFunctionResult> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            var localApiServerString = PlayFabSettings.LocalApiServer;

            if (!string.IsNullOrEmpty(localApiServerString))
            {
                var baseUri = new Uri(localApiServerString);
                var fullUri = new Uri(baseUri, "/CloudScript/ExecuteFunction".TrimStart('/'));
                PlayFabHttp.MakeApiCallWithFullUri(fullUri.AbsoluteUri, request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders);
                return;
            }

            PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders);
        }
        /// <summary>
        /// Calls an Azure Function via PlayFab to retrieve SignalR connection info specific to this client.
        /// </summary>
        /// <returns>The SignalR connection info to be used by this client.</returns>
        private async Task <SignalRConnectionInfo> GetConnectionInfo()
        {
            // We're getting the conneciton info from PlayFab. This will utilize the player's id to generate a unique access token.
            var getConnectionRequest = new ExecuteFunctionRequest()
            {
                FunctionName            = GetConnectionFunctionName,
                GeneratePlayStreamEvent = true
            };

            var getConnectionResult = await cloudScriptAPI.ExecuteFunctionAsync(getConnectionRequest);

            if (getConnectionResult.Error != null || getConnectionResult.Result.Error != null)
            {
                return(null);
            }

            return(JsonConvert.DeserializeObject <SignalRConnectionInfo>(getConnectionResult.Result.FunctionResult.ToString()));
        }
예제 #9
0
        /// <summary>
        /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of
        /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything.
        /// </summary>
        public static async Task <PlayFabResult <ExecuteFunctionResult> > ExecuteFunctionAsync(ExecuteFunctionRequest request, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            if ((request?.AuthenticationContext?.EntityToken ?? PlayFabSettings.staticPlayer.EntityToken) == null)
            {
                throw new PlayFabException(PlayFabExceptionCode.EntityTokenNotSet, "Must call GetEntityToken before calling this method");
            }

            var httpResult = await PlayFabHttp.DoPost("/CloudScript/ExecuteFunction", request, "X-EntityToken", PlayFabSettings.staticPlayer.EntityToken, extraHeaders);

            if (httpResult is PlayFabError)
            {
                var error = (PlayFabError)httpResult;
                PlayFabSettings.GlobalErrorHandler?.Invoke(error);
                return(new PlayFabResult <ExecuteFunctionResult> {
                    Error = error, CustomData = customData
                });
            }

            var resultRawJson = (string)httpResult;
            var resultData    = PluginManager.GetPlugin <ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject <PlayFabJsonSuccess <ExecuteFunctionResult> >(resultRawJson);
            var result        = resultData.data;

            return(new PlayFabResult <ExecuteFunctionResult> {
                Result = result, CustomData = customData
            });
        }
        /// <summary>
        /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of
        /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything.
        /// </summary>

        public void ExecuteFunction(ExecuteFunctionRequest request, Action <ExecuteFunctionResult> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, false, authenticationContext, ApiSettings);
        }
        /// <summary>
        /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of
        /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything.
        /// </summary>
        public static async Task <PlayFabResult <ExecuteFunctionResult> > ExecuteFunctionAsync(ExecuteFunctionRequest request, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            await new PlayFabUtil.SynchronizationContextRemover();

            var requestContext  = request?.AuthenticationContext ?? PlayFabSettings.staticPlayer;
            var requestSettings = PlayFabSettings.staticSettings;

            if (requestContext.EntityToken == null)
            {
                throw new PlayFabException(PlayFabExceptionCode.EntityTokenNotSet, "Must call Client Login or GetEntityToken before calling this method");
            }


            string localApiServerString = PlayFabSettings.LocalApiServer;

            if (!string.IsNullOrEmpty(localApiServerString))
            {
                var baseUri = new System.Uri(localApiServerString);
                var fullUri = new System.Uri(baseUri, "/CloudScript/ExecuteFunction".TrimStart('/'));

                // Duplicate code necessary to avoid changing all SDK methods to new convention
                var debugHttpResult = await PlayFabHttp.DoPostWithFullUri(fullUri.AbsoluteUri, request, "X-EntityToken", requestContext.EntityToken, extraHeaders);

                if (debugHttpResult is PlayFabError debugError)
                {
                    PlayFabSettings.GlobalErrorHandler?.Invoke(debugError);
                    return(new PlayFabResult <ExecuteFunctionResult> {
                        Error = debugError, CustomData = customData
                    });
                }

                var debugResultRawJson = (string)debugHttpResult;
                var debugResultData    = PluginManager.GetPlugin <ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject <PlayFabJsonSuccess <ExecuteFunctionResult> >(debugResultRawJson);
                var debugResult        = debugResultData.data;
                return(new PlayFabResult <ExecuteFunctionResult> {
                    Result = debugResult, CustomData = customData
                });
            }

            var httpResult = await PlayFabHttp.DoPost("/CloudScript/ExecuteFunction", request, "X-EntityToken", requestContext.EntityToken, extraHeaders);

            if (httpResult is PlayFabError)
            {
                var error = (PlayFabError)httpResult;
                PlayFabSettings.GlobalErrorHandler?.Invoke(error);
                return(new PlayFabResult <ExecuteFunctionResult> {
                    Error = error, CustomData = customData
                });
            }

            var resultRawJson = (string)httpResult;
            var resultData    = PluginManager.GetPlugin <ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject <PlayFabJsonSuccess <ExecuteFunctionResult> >(resultRawJson);
            var result        = resultData.data;

            return(new PlayFabResult <ExecuteFunctionResult> {
                Result = result, CustomData = customData
            });
        }
예제 #12
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = "CloudScript/ExecuteFunction")] HttpRequest request, ILogger log)
        {
            // Extract the caller's entity token
            string callerEntityToken = request.Headers["X-EntityToken"];

            // Extract the request body and deserialize
            StreamReader reader = new StreamReader(request.Body);
            string       body   = await reader.ReadToEndAsync();

            ExecuteFunctionRequest execRequest = PlayFabSimpleJson.DeserializeObject <ExecuteFunctionRequest>(body);

            // Grab the title entity token for authentication
            var titleEntityToken = await GetTitleEntityToken();

            var argumentsUri = GetArgumentsUri();

            // Prepare the `Get Arguments` request
            var contextRequest = new GetArgumentsForExecuteFunctionRequest
            {
                AuthenticationContext = new PlayFabAuthenticationContext
                {
                    EntityToken = titleEntityToken
                },
                CallingEntity = callerEntityToken,
                Request       = execRequest
            };

            // Execute the arguments request
            PlayFabResult <GetArgumentsForExecuteFunctionResult> getArgsResponse =
                await PlayFabCloudScriptAPI.GetArgumentsForExecuteFunctionAsync(contextRequest);

            // Validate no errors on arguments request
            if (getArgsResponse.Error != null)
            {
                throw new Exception("Failed to retrieve functions argument");
            }

            // Extract the request for the next stage from the get arguments response
            EntityRequest entityRequest = getArgsResponse?.Result?.Request;

            // Assemble the target function's path in the current App
            string routePrefix  = GetHostRoutePrefix();
            string functionPath = routePrefix != null ? routePrefix + "/" + execRequest.FunctionName
                : execRequest.FunctionName;

            // Build URI of Azure Function based on current host
            var uriBuilder = new UriBuilder
            {
                Host = request.Host.Host,
                Port = request.Host.Port ?? 80,
                Path = functionPath
            };

            // Serialize the request to the azure function and add headers
            var functionRequestContent = new StringContent(PlayFabSimpleJson.SerializeObject(entityRequest));

            functionRequestContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var sw = new Stopwatch();

            sw.Start();

            // Execute the local azure function
            using (var client = new HttpClient())
            {
                using (HttpResponseMessage functionResponseMessage =
                           await client.PostAsync(uriBuilder.Uri.AbsoluteUri, functionRequestContent))
                {
                    sw.Stop();
                    double executionTime = sw.ElapsedMilliseconds;

                    // Extract the response content
                    using (HttpContent functionResponseContent = functionResponseMessage.Content)
                    {
                        string functionResponseString = await functionResponseContent.ReadAsStringAsync();

                        // Prepare a response to reply back to client with and include function execution results
                        var functionResult = new ExecuteFunctionResult
                        {
                            FunctionName         = execRequest.FunctionName,
                            FunctionResult       = PlayFabSimpleJson.DeserializeObject(functionResponseString),
                            ExecutionTimeSeconds = executionTime
                        };

                        // Reply back to client with final results
                        var output = new PlayFabJsonSuccess <ExecuteFunctionResult>
                        {
                            code   = 200,
                            status = "OK",
                            data   = functionResult
                        };
                        var outputStr = PlayFabSimpleJson.SerializeObject(output);
                        return(new HttpResponseMessage
                        {
                            Content = new StringContent(outputStr, Encoding.UTF8, "application/json"),
                            StatusCode = HttpStatusCode.OK
                        });
                    }
                }
            }
        }