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