public static async Task HandleResultAsync( [QueueTrigger("roll-result-items")] RollContext res, ILogger log) { log.LogInformation($"HandleResultAsync processed: {RealDiceConverter.Serialize(res)}"); await SendResult(res); }
public async Task RequestAsync(IActivity referenceActivity, RollRequest rollRequest) { var context = new RollContext { Id = Guid.NewGuid().ToString(), MetaData = new Dictionary <string, string> { ["RequestActivity"] = RealDiceConverter.Serialize(referenceActivity), }, Requests = new RollRequest[] { rollRequest }, }; var message = Convert.ToBase64String(Encoding.UTF8.GetBytes(RealDiceConverter.Serialize(context))); await requestQueueClient.SendMessageAsync(message); }
public static async Task HandleEdgeResultAsync( [EventHubTrigger("%IoTHubEventHubsName%", Connection = "IoTHubEventHubsConnectionString")] EdgeRollResponse res, [Table("rollcontext", "Bot", "{id}")] RollContextTableRow rollContext, ILogger log) { log.LogInformation($"HandleResultAsync processed: {RealDiceConverter.Serialize(res)}"); log.LogInformation($" RollContextTableRow: {RealDiceConverter.Serialize(rollContext)}"); if (rollContext == null) { // どうすることもできない return; } // 添付ファイルのアップロードを待つ // XXX ここで待ちたくない&待つにしてももう少しやりようがありそう var connectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage"); // XXX 変数にする var containarName = "realdiceresults"; var blobService = new BlobServiceClient(connectionString); var blobContainer = blobService.GetBlobContainerClient(containarName); var photoBlob = blobContainer.GetBlobClient(res.PhotoName); var videoBlob = blobContainer.GetBlobClient(res.VideoName); await WaitUploadBlob(photoBlob, 3, 100, log); await WaitUploadBlob(videoBlob, 5, 800, log); var containerUrl = Environment.GetEnvironmentVariable("ResultContainerBaseUri"); var photoUrl = new Uri(new Uri(containerUrl), res.PhotoName); var videoName = new Uri(new Uri(containerUrl), res.VideoName); rollContext.Results = rollContext.Requests.Select(x => new RollResult { Request = x, Status = res.Status, Score = res.Score, Results = new uint[] { (uint)res.Result }, PhotoUrl = string.IsNullOrEmpty(res.PhotoName) ? null : photoUrl.ToString(), VideoUrl = string.IsNullOrEmpty(res.VideoName) ? null : videoName.ToString(), }).ToList(); await SendResult(rollContext); }
private static async Task SendResult(RollContext res) { var originalActivity = RealDiceConverter.Deserialize <Activity>(res.MetaData["RequestActivity"]); originalActivity.Value = RealDiceConverter.Serialize(res); var responseActivity = new Activity("event"); responseActivity.Value = originalActivity; responseActivity.Name = "RollResult"; responseActivity.From = new ChannelAccount("RealDiceFunctionsRollResult", "RealDiceFunctions"); var directLineSecret = Environment.GetEnvironmentVariable("DirectLineSecret"); using (DirectLineClient client = new DirectLineClient(directLineSecret)) { var conversation = await client.Conversations.StartConversationAsync(); await client.Conversations.PostActivityAsync(conversation.ConversationId, responseActivity); } }
public static async Task HandleRequestAsync( [QueueTrigger("roll-request-items")] RollContext req, [Queue("roll-result-items")] IAsyncCollector <RollContext> rollQueue, [Table("rollcontext")] IAsyncCollector <RollContextTableRow> rollTable, ILogger log) { log.LogInformation($"HandleRequestAsync processed: {RealDiceConverter.Serialize(req)}"); try { var iotHubServiceClient = ServiceClient.CreateFromConnectionString( Environment.GetEnvironmentVariable("IoTHubConnectionString")); var resRow = JsonConvert.DeserializeObject <RollContextTableRow>(JsonConvert.SerializeObject(req)); resRow.PartitionKey = "Bot"; resRow.RowKey = resRow.Id; await rollTable.AddAsync(resRow); // https://github.com/Azure-Samples/azure-iot-samples-csharp/blob/master/iot-hub/Quickstarts/back-end-application/BackEndApplication.cs var edgeMethodInvocation = new CloudToDeviceMethod( "Roll", TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30) ); edgeMethodInvocation.SetPayloadJson(JsonConvert.SerializeObject(new EdgeRollRequest { Id = req.Id, // XXX メッセージを受け取る。 Message = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") })); var testres = await iotHubServiceClient.GetServiceStatisticsAsync(); log.LogInformation($" GetServiceStatisticsAsync: {RealDiceConverter.Serialize(testres)}"); // XXX 複数Edgeを扱えるようになればDeviceIdは動的にバランスさせたい。 var deviceId = Environment.GetEnvironmentVariable("IoTHubRealDiceEdgeDeviceId"); var moduleId = Environment.GetEnvironmentVariable("IoTHubRealDiceEdgeModuleId"); var edgeResponse = await iotHubServiceClient.InvokeDeviceMethodAsync( deviceId, moduleId, edgeMethodInvocation ); log.LogInformation($" edgeResponse: {RealDiceConverter.Serialize(edgeResponse)}"); if (edgeResponse.Status < 300) { return; } } catch (Exception ex) { log.LogError(ex, $" Edge Request Failed: {ex.Message}"); } // Edgeへのリクエストが失敗したらFunctionsで応答するためのキューに結果を入れる。 var res = req; res.Results = req.Requests.Select(x => new RollResult { Request = x, Status = "Offline", Results = Enumerable.Range(0, (int)x.N).Select(x => (uint)randomizer.Next(1, 7)).ToArray(), }).ToList(); await rollQueue.AddAsync(res); }