예제 #1
0
        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)
            });
        }
예제 #2
0
        private async Task DeleteCardStorageAsync(BingoEntry cardEntry)
        {
            await _tableStorage.DeleteCardEntryAsync(cardEntry);

            await _tableStorage.DeleteCardUserAsync(cardEntry);

            await _blobStorage.DeleteDirectoryAsync(cardEntry.CardId.ToString());
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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}のゲームから抜けて、カードの情報を削除しました。");
                }
            }
        }