private async Task BloadcastUserMessageAsync(UserProfile user, string userMessage, BingoEntry gameEntry, BingoEntry cardEntry) { BingoEntry bingoEntry; string gameUserId; if (cardEntry != null) { gameUserId = _tableStorage.FindGameEntry(cardEntry.GameId)?.RowKey; bingoEntry = cardEntry; } else { bingoEntry = gameEntry; gameUserId = gameEntry.RowKey; } var cardUsers = await _tableStorage.GetCardUsersAsync(bingoEntry.GameId); var to = cardUsers .Select(u => u.UserId) .Concat(new[] { gameUserId }) .Where(u => u != user.UserId).ToArray(); await _messagingClient.MultiCastMessageAsync(to, new[] { new TextMessage("@" + user.DisplayName + Environment.NewLine + userMessage) }); }
private async Task DeleteCardStorageAsync(BingoEntry cardEntry) { await _tableStorage.DeleteCardEntryAsync(cardEntry); await _tableStorage.DeleteCardUserAsync(cardEntry); await _blobStorage.DeleteDirectoryAsync(cardEntry.CardId.ToString()); }
private async Task DeleteCardsAsync(BingoEntry gameEntry) { var users = await _tableStorage.GetCardUsersAsync(gameEntry.GameId); var tasks = users.Select(async usr => { var cardEntry = await _tableStorage.FindCardEntryAsync(usr.UserId); await DeleteCardStorageAsync(cardEntry); }); await Task.WhenAll(tasks); }
private async Task RunGameAsync(string replyToken, BingoEntry gameUser) { try { var gameStatus = await _bingoClient.DrawNextNumber(gameUser.GameId, gameUser.AccessKey); var drawNumber = gameStatus.DrawResults.Last(); //Get all card-statuses in this game from BINGO API. var tasks = gameStatus.Cards.Select(async cardId => await _bingoClient.GetCardStatusAsync(cardId)).ToArray(); var cardStatuses = await Task.WhenAll(tasks); //Get all card-users in this game from table storage. var cardUsers = await _tableStorage.GetCardUsersAsync(gameUser.GameId); //Set bingo-line and lizhi-line counts from card-statuses to card-Users. SetNextLineCount(cardStatuses, cardUsers); var lizhiMessages = cardUsers .Where(cusr => cusr.NextBingoLineCount == cusr.BingoLineCount) .Where(cusr => cusr.NextLizhiLineCount > cusr.LizhiLineCount) .Select(cusr => $"{cusr.UserName}さん リーチ{((cusr.NextLizhiLineCount > 1) ? "×" + cusr.NextLizhiLineCount : "")}!"); var bingoMessages = cardUsers .Where(cusr => cusr.NextBingoLineCount > cusr.BingoLineCount) .Select(cusr => $"{cusr.UserName}さん ビンゴ{((cusr.NextBingoLineCount > 1) ? "×" + cusr.NextBingoLineCount : "")}!!"); var messages = new[] { $"No. {drawNumber}!!" } .Concat(lizhiMessages) .Concat(bingoMessages) .Select(msg => new TextMessage(msg)).OfType <ISendMessage>().ToList(); await _messagingClient.ReplyMessageAsync(replyToken, messages); await _messagingClient.MultiCastMessageAsync(cardUsers.Select(cusr => cusr.UserId).ToList(), messages); await UpdateCardUserLineCountAsync(cardUsers); } catch (Exception e) { throw new RunGameException(e.Message, e); } }
private async Task DeleteBingoEntry(string replyToken, BingoEntry gameEntry, BingoEntry cardEntry) { if (gameEntry != null) { await _tableStorage.DeleteGameEntryAsync(gameEntry); await DeleteCardsAsync(gameEntry); await _bingoClient.DeleteGameAsync(gameEntry.GameId, gameEntry.AccessKey); if (gameEntry.GameId < 0) { await _messagingClient.ReplyMessageAsync(replyToken, "ゲームを終了しました。"); } else { await _messagingClient.ReplyMessageAsync(replyToken, $"ID:{gameEntry.GameId}のゲームと、ゲームの情報、参加者の情報を全て削除しました。"); } } else if (cardEntry != null) { await DeleteCardStorageAsync(cardEntry); if (cardEntry.CardId < 0) { await _messagingClient.ReplyMessageAsync(replyToken, "ゲームへの参加をやめました。"); } else { await _messagingClient.ReplyMessageAsync(replyToken, $"ID:{cardEntry.GameId}のゲームから抜けて、カードの情報を削除しました。"); } } }