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