I made a C# source generator for generating Azure Functions boilerplate code, so that the actual server code is more similar to the previous JS CloudScripts. It's a proof of concept, and I still need to test whether the generated code actually works on actual servers.
The repo is at https://github.com/heshuimu/PlayFabAzureFunctionTool
With the generator, I can write server code more like the previous JS CloudScript:
using System.Threading.Tasks; using Microsoft.Extensions.Logging; using PlayFab; using K4.AzureFunctions; [assembly: DefaultAuthorizationLevel(DummyAuthLevel.Function)] public class DummyClass { public PlayFabServerInstanceAPI Server { get; init; } public string CurrentPlayerID { get; init; } public class DummyInput { } [AzureFunction(Name = "abc", AuthorizationLevel = DummyAuthLevel.Anonymous)] public async Task<int> DummyInstanceMethod(DummyInput input) { return 1; } [AzureFunction] public async Task DummVoidMethod(DummyInput input, ILogger log) { } [AzureFunction] public static void DummyStaticMethod(PlayFabServerInstanceAPI server, string currentPlayerID) { } }
And the tool will generate the following:
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using PlayFab.Plugins.CloudScript; using PlayFab; class GeneratedAzureFunction { [FunctionName("abc")] public static async Task<IActionResult> abc_Generated([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req, ILogger log) { var functionContext = await FunctionContext<DummyClass.DummyInput>.Create(req); PlayFabServerInstanceAPI server = new(functionContext.ApiSettings, functionContext.AuthenticationContext); string currentPlayerID = functionContext.CurrentPlayerId; var result = await new DummyClass(){ Server = server, CurrentPlayerID = currentPlayerID }.DummyInstanceMethod(functionContext.FunctionArgument); return new OkObjectResult(result); } [FunctionName("DummVoidMethod")] public static async Task<IActionResult> DummVoidMethod_Generated([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { var functionContext = await FunctionContext<DummyClass.DummyInput>.Create(req); PlayFabServerInstanceAPI server = new(functionContext.ApiSettings, functionContext.AuthenticationContext); string currentPlayerID = functionContext.CurrentPlayerId; await new DummyClass(){ Server = server, CurrentPlayerID = currentPlayerID }.DummVoidMethod(functionContext.FunctionArgument, log); return new OkResult(); } [FunctionName("DummyStaticMethod")] public static async Task<IActionResult> DummyStaticMethod_Generated([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { var functionContext = await FunctionContext.Create(req); PlayFabServerInstanceAPI server = new(functionContext.ApiSettings, functionContext.AuthenticationContext); string currentPlayerID = functionContext.CurrentPlayerId; DummyClass.DummyStaticMethod(server, currentPlayerID); return new OkResult(); } }