Exemplo n.º 1
0
    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