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
Exemplo n.º 2
0
    def GenerateImage(self,
                      data: dict,
                      date: str,
                      text_override: dict = {},
                      specialoffer: str = "Special Offers",
                      namefont: str = "",
                      categoryfont: str = "") -> bool:
        try:
            Splited = Utility.Split_Special(self, data=data)
            Sorted = Utility.Sort_Item(self, data=Splited)
            Overrided = Utility.Text_Override(
                self, data=Sorted, text_override=text_override['categories'])
            Extracted = Utility.Extract_ItemShop(self, Overrided)
            if len(Extracted['featured']) > 1 or len(
                    Extracted['daily']) > 1 or len(Extracted['special']) > 1:
                if len(Extracted['special']) > 1:
                    rows = max(ceil(len(Extracted['featured']) / 4),
                               ceil(len(Extracted['daily']) / 4),
                               ceil(len(Extracted['special']) / 4))
                    ShopImage = Image.new("RGBA", (3800, ((545 * rows) + 365)))
                else:
                    rows = max(ceil(len(Extracted['featured']) / 4),
                               ceil(len(Extracted['daily']) / 4))
                    ShopImage = Image.new("RGBA", (2550, ((545 * rows) + 365)))

                try:
                    background = ImageUtil.Open(self, "background.png")
                    background = ImageUtil.RatioResize(self, background,
                                                       ShopImage.width,
                                                       ShopImage.height)
                    ShopImage.paste(
                        background,
                        ImageUtil.CenterX(self, background.width,
                                          ShopImage.width))
                except FileNotFoundError:
                    log.warning("Failed to open background.png")

                for num, unity in enumerate(Extracted.items()):
                    if len(unity[1]) > 1:
                        Unity = ShopBot.GenerateUnity(self, unity[1], namefont,
                                                      categoryfont)
                        if Unity is not None:
                            canvas = ImageDraw.Draw(ShopImage)
                            font = ImageUtil.OpenFont(self, 48, namefont)
                            ShopImage.paste(Unity, ((num * 1200) +
                                                    ((num + 1) * 50), 315),
                                            Unity)
                            if unity[0] != "special":
                                canvas.text(
                                    (50 + (num * 1250), 260),
                                    text_override.get(unity[0],
                                                      unity[0].capitalize()),
                                    font=font)
                            else:
                                canvas.text((50 + (num * 1250), 260),
                                            specialoffer,
                                            font=font)
                    else:
                        log.debug(f"{unity[0]} is None")
            else:
                ShopImage = Image.new("RGBA", (2550, 365))
                try:
                    background = ImageUtil.Open(self, "background.png")
                    background = ImageUtil.RatioResize(self, background,
                                                       ShopImage.width,
                                                       ShopImage.height)
                    ShopImage.paste(
                        background,
                        ImageUtil.CenterX(self, background.width,
                                          ShopImage.width))
                except FileNotFoundError:
                    log.warning("Failed to open background.png")

                canvas = ImageDraw.Draw(ShopImage)
                font = ImageUtil.OpenFont(self, 48, namefont)
                canvas.text((50, 260),
                            text_override.get("featured", "Featured"),
                            font=font)
                canvas.text((1300, 260),
                            text_override.get("daily", "Daily"),
                            font=font)
                log.info("Shop is None")

            try:
                logo = ImageUtil.Open(self, "logo.png").convert("RGBA")
                logo = ImageUtil.RatioResize(self, logo, 0, 210)
                ShopImage.paste(
                    logo, ImageUtil.CenterX(self, logo.width, ShopImage.width),
                    logo)
            except FileNotFoundError:
                log.warning("Failed to open logo.png")

            font = ImageUtil.OpenFont(self, 40, namefont)
            canvas.text((5, 5), date, font=font)

            ShopImage.save("itemshop.png")
            return True
        except Exception as e:
            log.error(self, f"Failed to generate image, {e}")
            return False