Esempio n. 1
0
            private async Task <(Stream ImageStream, string ToSend)> InternalDraw(int num, ulong?guildId = null)
            {
                if (num < 1 || num > 10)
                {
                    throw new ArgumentOutOfRangeException(nameof(num));
                }

                Deck cards       = guildId == null ? new Deck() : _allDecks.GetOrAdd(Context.Guild, (s) => new Deck());
                var  images      = new List <Image <Rgba32> >();
                var  cardObjects = new List <Deck.Card>();

                for (var i = 0; i < num; i++)
                {
                    if (cards.CardPool.Count == 0 && i != 0)
                    {
                        try
                        {
                            await ReplyErrorLocalizedAsync("harrow_no_more").ConfigureAwait(false);
                        }
                        catch
                        {
                            // ignored
                        }
                        break;
                    }
                    var currentCard = cards.Draw();
                    cardObjects.Add(currentCard);
                    images.Add(Image.Load(_images.GetCard(currentCard.ToString().ToLowerInvariant().Replace(' ', '_'))));
                }
                using (var img = images.Merge())
                {
                    foreach (var i in images)
                    {
                        i.Dispose();
                    }

                    var toSend = $"{Format.Bold(Context.User.ToString())}";
                    if (cardObjects.Count == 5)
                    {
                        toSend += $" drew `{Deck.GetHandValue(cardObjects)}`";
                    }

                    if (guildId != null)
                    {
                        toSend += "\n" + GetText("cards_left", Format.Bold(cards.CardPool.Count.ToString()));
                    }

                    return(img.ToStream(), toSend);
                }
            }