def GenerateCard(self, card: dict, namefont: str, categoryfont: str) -> ("PIL Image", None): Card = Image.new("RGB", (300, 545)) name = card["items"][0]["name"] category = card["items"][0]["type"] displaycategory = card["items"][0]["displayType"] rarity = card["items"][0]["rarity"] backend_rarity = card["items"][0]["backendRarity"].replace( "EFortRarity::", "", 1).lower() regularprice = card["regularPrice"] finalprice = card["finalPrice"] regularprice = str(f"{regularprice:,}") finalprice = str(f"{finalprice:,}") banner = card["banner"] if category == "outfit" or category == "wrap" or category == "banner": if card["items"][0]["images"]["featured"] is not None: icon = card["items"][0]["images"]["featured"]["url"] else: log.debug("featured image not found, changing to icon") icon = card["items"][0]["images"]["icon"]["url"] else: icon = card["items"][0]["images"]["icon"]["url"] icon = ImageUtil.GET_Image(self, icon).convert("RGBA") if category == "backpack" or category == "pickaxe" or category == "glider" or category == "wrap" or category == "music": icon = ImageUtil.RatioResize(self, icon, Card.width // 1.6, Card.height // 1.6) else: icon = ImageUtil.RatioResize(self, icon, Card.width, Card.height) try: try: image = ImageUtil.Open( self, f"color_{rarity}.png").convert("RGBA").resize( (Card.width, Card.height)).convert("RGBA") except FileNotFoundError as e: log.warning( f"Rarity {rarity} not found, defaulted to backend {backend_rarity}" ) image = ImageUtil.Open( self, f"color_{backend_rarity}.png").convert("RGBA").resize( (Card.width, Card.height)).convert("RGBA") Card.paste(image, (0, 0), image) if category == "backpack" or category == "pickaxe" or category == "glider" or category == "wrap" or category == "music": Card.paste( icon, ImageUtil.CenterX(self, icon.width, Card.width, icon.width // 6), icon) else: Card.paste(icon, ImageUtil.CenterX(self, icon.width, Card.width), icon) image = ImageUtil.Open(self, f"card_plate_{rarity}.png").convert("RGBA") Card.paste(image, (0, 0), image) image = ImageUtil.Open(self, f"card_mask_{rarity}.png").convert("RGBA") Card.paste(image, (0, 0), image) canvas = ImageDraw.Draw(Card) font = ImageUtil.OpenFont( self, ImageUtil.FontSize(self, Card.width, 28, name), namefont) textwidth, _ = font.getsize(f"{name}") canvas.text(ImageUtil.CenterX(self, textwidth, Card.width, 430), f"{name}", font=font) font = ImageUtil.OpenFont( self, ImageUtil.FontSize(self, Card.width, 20, category), categoryfont) textwidth, _ = font.getsize(f"{displaycategory}") canvas.text(ImageUtil.CenterX(self, textwidth, Card.width, 458), f"{displaycategory}", (160, 160, 160), font=font) vbucks = ImageUtil.Open(self, "vbucks.png") vbucks = ImageUtil.RatioResize(self, vbucks, 35, 35) if regularprice == finalprice: regularfont = ImageUtil.OpenFont(self, 28, categoryfont) textWidth, _ = font.getsize(regularprice) canvas.text(ImageUtil.CenterX(self, ((textWidth - 5) - vbucks.width), Card.width, 494), regularprice, font=regularfont) Card.paste( vbucks, ImageUtil.CenterX(self, (vbucks.width + (textWidth + 5)), Card.width, 499), vbucks) else: finalfont = ImageUtil.OpenFont(self, 28, categoryfont) regularfont = ImageUtil.OpenFont(self, 22, categoryfont) regularWidth, regularHeight = regularfont.getsize(regularprice) Width, Height = regularfont.getsize( regularprice.replace(",", " ")) finalWidth, finalHeight = finalfont.getsize(finalprice) discount = ImageUtil.Open(self, "discount.png") discount = discount.resize((Width, Height - 5)) canvas.text(ImageUtil.CenterX( self, ((finalWidth + regularWidth - 5) - vbucks.width), Card.width, 494), finalprice, font=finalfont) Card.paste( vbucks, ImageUtil.CenterX(self, (vbucks.width + (finalWidth + regularWidth + 5)), Card.width, 499), vbucks) pos = ImageUtil.CenterX(self, (finalWidth + regularWidth - 5) - vbucks.width, Card.width, 499) canvas.text((pos[0] + 60, pos[1]), regularprice, (160, 160, 160), font=regularfont) pos2 = ImageUtil.CenterX( self, (finalWidth + regularWidth - 5) - vbucks.width, Card.width, 497 + (discount.height // 2)) Card.paste(discount, (pos2[0] + 60, pos2[1]), discount) if banner is not None: font = ImageUtil.OpenFont(self, 20, namefont) bannerWidth, bannerHeight = font.getsize(banner) banner_middle = ImageUtil.Open( self, "banner_middle.png").convert("RGBA") banner_middle = banner_middle.resize((bannerWidth + 45, 35)) banner_rear = ImageUtil.Open(self, "banner_rear.png").convert("RGBA") banner_rear = ImageUtil.RatioResize_NoAA( self, banner_rear, 0, 35) banner_front = ImageUtil.Open( self, "banner_front.png").convert("RGBA") banner_front = banner_front.resize((bannerWidth + 45, 35)) Card.paste(banner_middle, (0, 0), banner_middle) Card.paste(banner_rear, (0, 0), banner_rear) Card.paste(banner_front, (0, 0), banner_front) canvas.text((8, 8), banner, font=font) return Card except Exception as e: log.error(self, f"Failed to generate card, {e}") return None