Exemplo n.º 1
0
        private async Task <Result> ReplyWithRollsAsync(Snowflake channel, RollResponse rollResponse)
        {
            var rolls = rollResponse.Dice
                        .GroupBy(d => d.Type)
                        .ToDictionary
                        (
                g => g.Key,
                g => g.Select(d => d.Value).Aggregate((a, b) => a + b)
                        );

            var fields = rolls.Select(kvp => new EmbedField(kvp.Key, kvp.Value.ToString(), true)).ToList();
            var embed  = new Embed("Rolls", Fields: fields, Colour: Color.LawnGreen);

            var replyRolls = await _channelAPI.CreateMessageAsync(channel, embeds : new[] { embed });

            return(!replyRolls.IsSuccess
                ? Result.FromError(replyRolls)
                : Result.FromSuccess());
        }
Exemplo n.º 2
0
        static async Task RollInternal(MethodRequest methodRequest, ModuleClient moduleClient)
        {
            try
            {
                WriteLog($"Start RollInternal {methodRequest.DataAsJson}");

                var    req        = JsonConvert.DeserializeObject <RollRequest>(methodRequest.DataAsJson);
                string reqMessage = req.Message;

                //キャプション設定
                WriteLog($"reqCaption");
                var reqCaptionResult = await cameraClient.PostAsync("caption",
                                                                    new StringContent(JsonConvert.SerializeObject(new CaptionRequest
                {
                    Caption = reqMessage,
                })));

                WriteLog($"reqCaptionResult: {reqCaptionResult.StatusCode}");

                //録画開始
                WriteLog($"recStart");
                var recStartResult = await cameraClient.PostAsync("/video/start", new StringContent(""));

                WriteLog($"recStartResult: {recStartResult.StatusCode}");

                //ダイスオン
                WriteLog($"gpio start");
                gpioController.Write(GPIO_MOTAR_STBY, PinValue.High);
                gpioController.Write(GPIO_MOTAR_AIN1, PinValue.Low);
                gpioController.Write(GPIO_MOTAR_AIN2, PinValue.High);

                // 回す時間分だけ待つ。
                await Task.Delay(randomizer.Next(1500, 2000));

                //ダイスオフ
                gpioController.Write(GPIO_MOTAR_AIN1, PinValue.High);
                gpioController.Write(GPIO_MOTAR_AIN2, PinValue.High);
                await Task.Delay(500);

                gpioController.Write(GPIO_MOTAR_STBY, PinValue.Low);
                gpioController.Write(GPIO_MOTAR_AIN1, PinValue.Low);
                gpioController.Write(GPIO_MOTAR_AIN2, PinValue.Low);
                WriteLog($"gpio end");
                // 止まる見込みまで待つ。
                // XXX ビデオで停止を認識できるとカッコいい。
                // 動体がなければいいので比較的平易にできるはず。
                await Task.Delay(1500);

                //静止画取得
                WriteLog($"takePhoto");
                var takePhotoResult = await cameraClient.PostAsync("/photo", new StringContent(""));

                WriteLog($"takePhotoResult: {takePhotoResult.StatusCode}");
                var takePhotoResultStr = await takePhotoResult.Content.ReadAsStringAsync();

                WriteLog($"    {takePhotoResultStr}");
                dynamic takePhotoResultObj = JsonConvert.DeserializeObject(takePhotoResultStr);
                string  photoFileName      = takePhotoResultObj.PhotoFileName;

                WriteLog($"waitCaption");
                var waitCaptionResult = await cameraClient.PostAsync("caption",
                                                                     new StringContent(JsonConvert.SerializeObject(new CaptionRequest
                {
                    Caption = "Recognizing...",
                })));

                WriteLog($"waitCaptionResult: {waitCaptionResult.StatusCode}");

                //静止画認識
                WriteLog($"cognitive");
                int    rollResult              = randomizer.Next(1, 6);
                double rollResultScore         = 0.0;
                string resultStatus            = "Error";
                var    blob                    = cloudBlobContainer.GetBlockBlobReference(photoFileName);
                var    cognitiveRequestContent = new MultipartFormDataContent();
                var    imageDataContent        = new StreamContent(await blob.OpenReadAsync());
                imageDataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name     = "imageData",
                    FileName = Path.GetFileName(photoFileName),
                };
                cognitiveRequestContent.Add(imageDataContent, "imageData", Path.GetFileName(photoFileName));
                var cognitiveResult = await cognitiveClient.PostAsync("/image", cognitiveRequestContent);

                WriteLog($"cognitiveResult: {cognitiveResult.StatusCode}");
                var cognitiveResultString = await cognitiveResult.Content.ReadAsStringAsync();

                WriteLog(cognitiveResultString);
                CognitiveResult cognitiveResultObject = null;
                if (cognitiveResult.StatusCode == HttpStatusCode.OK)
                {
                    cognitiveResultObject = JsonConvert.DeserializeObject <CognitiveResult>(cognitiveResultString);
                    var predictions = cognitiveResultObject.predictions;
                    if (predictions.Any())
                    {
                        var    prediction = predictions[0];
                        string labelName  = prediction.tagName;
                        int    labelResult;
                        if (int.TryParse(new string(labelName.TakeLast(1).ToArray()), out labelResult))
                        {
                            rollResult      = labelResult;
                            rollResultScore = prediction.probability;
                            resultStatus    = "Success";
                        }
                    }
                    else
                    {
                        resultStatus = "UnRecognized";
                    }
                }

                //キャプション設定
                WriteLog($"resCaption");
                var resCaptionResult = await cameraClient.PostAsync("caption",
                                                                    new StringContent(JsonConvert.SerializeObject(new CaptionRequest
                {
                    Caption = $"1d6 = {rollResult} ! (Score: {rollResultScore})",
                    CognitiveResult = cognitiveResultObject,
                })));

                WriteLog($"resCaptionResult: {resCaptionResult.StatusCode}");

                // キャプションが入るまで待つ
                await Task.Delay(150);

                try
                {
                    // 返却用の結果静止画
                    WriteLog($"takePhotoWithCaption");
                    takePhotoResult = await cameraClient.PostAsync("/photo_with_caption", new StringContent(""));

                    WriteLog($"takePhotoWithCaptionResult: {takePhotoResult.StatusCode}");
                    takePhotoResultStr = await takePhotoResult.Content.ReadAsStringAsync();

                    WriteLog($"    {takePhotoResultStr}");
                    takePhotoResultObj = JsonConvert.DeserializeObject(takePhotoResultStr);
                    photoFileName      = takePhotoResultObj.PhotoFileName;
                }
                catch { }

                await Task.Delay(2000);

                //録画終了
                WriteLog($"recEnd");
                var recEndResult = await cameraClient.PostAsync("/video/end", new StringContent(""));

                var recEndResultStr = await recEndResult.Content.ReadAsStringAsync();

                WriteLog($"    {recEndResultStr}");
                dynamic recEndResultObj = JsonConvert.DeserializeObject(recEndResultStr);
                string  videoFileName   = recEndResultObj.VideoFileName;
                WriteLog($"recEndResult: {recEndResult.StatusCode}");

                // GIF化
                try
                {
                    var gifBlob = await ConvertVideoToGif(cloudBlobContainer.GetBlockBlobReference(videoFileName));

                    videoFileName = gifBlob.Name;
                }
                catch (Exception ex)
                {
                    WriteLog(ex.Message);
                }

                await cameraClient.PostAsync("caption",
                                             new StringContent(JsonConvert.SerializeObject(new CaptionRequest
                {
                    Caption = "",
                })));

                //ダイスロール応答メッセージ
                WriteLog($"resMessage");
                var res = new RollResponse
                {
                    Id        = req.Id,
                    Status    = resultStatus,
                    Result    = rollResult,
                    Score     = rollResultScore,
                    PhotoName = photoFileName,
                    VideoName = videoFileName,
                };
                await moduleClient.SendEventAsync(
                    "RollResult",
                    new Message(Encoding.UTF8.GetBytes(
                                    JsonConvert.SerializeObject(res)
                                    )
                                ));

                WriteLog($"resMessageEnd");

                WriteLog($"End RollInternal {methodRequest.DataAsJson}");
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message);
                WriteLog(ex.StackTrace);
                throw;
            }
            finally
            {
                try
                {
                    gpioController.Write(GPIO_MOTAR_STBY, PinValue.Low);
                    gpioController.Write(GPIO_MOTAR_AIN1, PinValue.Low);
                    gpioController.Write(GPIO_MOTAR_AIN2, PinValue.Low);
                }
                catch { }
            }
        }