async def reading(spread: str) -> Tuple[Optional[io.BytesIO], List[Tuple[str, str, str]]]: w, h = (200, 326) # card size space = 20 # space between cards if spread == 'ppf': # three cards dealt horizontally bg_size = (3 * w + 4 * space, h + 2 * space) cards = await Deck.get_random_cards(3) position = [ (space, space), (w + 2 * space, space), (2 * w + 3 * space, space) ] position_legend = ['PAST', 'PRESENT', 'FUTURE'] elif spread == 'five': # five cards dealt in a cross bg_size = (3 * w + 4 * space, 3 * h + 4 * space) cards = await Deck.get_random_cards(5) position = [ (space, 2 * space + h), (w + 2 * space, 2 * space + h), (2 * w + 3 * space, 2 * space + h), (w + 2 * space, 3 * space + 2 * h), (w + 2 * space, space) ] position_legend = ['PAST', 'PRESENT', 'FUTURE', 'REASON', 'POTENTIAL'] elif spread == 'one': bg_size = (w, h) cards = await Deck.get_random_cards(1) position = [ (0, 0) ] position_legend = ['\u200d'] else: raise commands.BadArgument('Spread is invalid.') bg = Image.new('RGBA', bg_size, (0, 0, 0, 0)) interpretation = [] # type: List[Tuple[str, str, str]] for i, card in enumerate(cards): reverse = True if random.random() < 0.12 else False card_image = await card.get_image(reverse) bg.paste(card_image, position[i]) if reverse: name = card.name + '\n(Reversed)' descr = card.description_reversed else: name = card.name descr = card.description_upright interpretation.append((position_legend[i], name, descr)) return image_to_buffer([bg]), interpretation
async def get_image_buff(self, reverse: bool = False) -> BytesIO: return image_to_buffer([await self.get_image(reverse)])