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()); }
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()); }
/// <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); }
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); }
/// <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())); }
/// <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 }); }
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 }); } } } }