コード例 #1
0
ファイル: RealDiceBot.cs プロジェクト: 7474/RealDiceBot
        protected override async Task OnEventActivityAsync(ITurnContext <IEventActivity> turnContext, CancellationToken cancellationToken)
        {
            if (turnContext.Activity.ChannelId == Channels.Directline && turnContext.Activity.Name == "RollResult")
            {
                var continueConversationActivity = (turnContext.Activity.Value as JObject)?.ToObject <Activity>();
                await turnContext.Adapter.ContinueConversationAsync(_botId, continueConversationActivity.GetConversationReference(), async (context, cancellation) =>
                {
                    logger.LogInformation(continueConversationActivity.Value as string);
                    var res          = RealDiceConverter.Deserialize <RollContext>(continueConversationActivity.Value as string);
                    var res0         = res.Results[0];
                    string exMessage = "";
                    if (res0.Status != "Success")
                    {
                        exMessage = $"({res0.Status})\n";
                    }
                    var message =
                        $"1d6 = {res0.Results[0]} !\n" +
                        $"(Score: {res0.Score})\n" +
                        exMessage +
                        $"> {continueConversationActivity.Text}";

                    var activity         = MessageFactory.Text(message);
                    activity.Attachments = GetAttachments(res0);

                    await context.SendActivityAsync(activity, cancellationToken);
                }, cancellationToken);
            }
            else
            {
                await base.OnEventActivityAsync(turnContext, cancellationToken);
            }
        }
コード例 #2
0
ファイル: RealDiceRoll.cs プロジェクト: 7474/RealDiceBot
        public static async Task HandleResultAsync(
            [QueueTrigger("roll-result-items")] RollContext res,
            ILogger log)
        {
            log.LogInformation($"HandleResultAsync processed: {RealDiceConverter.Serialize(res)}");

            await SendResult(res);
        }
コード例 #3
0
 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);
 }
コード例 #4
0
ファイル: RealDiceRoll.cs プロジェクト: 7474/RealDiceBot
        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);
        }
コード例 #5
0
ファイル: RealDiceRoll.cs プロジェクト: 7474/RealDiceBot
        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);
            }
        }
コード例 #6
0
ファイル: RealDiceRoll.cs プロジェクト: 7474/RealDiceBot
        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);
        }