Image.py

← Back to explorer
Cogs/Image.py
import os
import time

import discord, json, requests
from discord.ext import commands
from discord import app_commands
from customs.log import AuroraLogger
from io import BytesIO
from PIL import Image, ImageOps, ImageFilter
from asyncdagpi import Client, ImageFeatures

file = open("config.json", "r")
config = json.loads(file.read())
error_logger = AuroraLogger("AuroraErrorLog", "logs/errors.log")


# VIEW
class DeleteButton(discord.ui.View):
    def __init__(self):
        super().__init__()

    @discord.ui.button(emoji="<:delete:912359260954984459>", style=discord.ButtonStyle.red)
    async def delete(self, interaction: discord.Interaction, button: discord.Button):
        await interaction.response.defer()
        await interaction.delete_original_message()


class ImageManipulation(commands.GroupCog, name="image"):
    def __init__(self, client):
        self.client = client
        self.dagpi = Client(config["API_KEYS"]["DAGPI_KEY"])

    @app_commands.command(name="b_w", description="Give a black and white version of the image.")
    @app_commands.describe(
        member="The avatar of the member.",
        attachment="The image file which you want to edit."
    )
    async def black_and_white_user(self, interaction: discord.Interaction, member: discord.Member = None,
                                   attachment: discord.Attachment = None):
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.response.send_message(
                    "<a:alert:997769654141452359> You can give only one option at once!")
            elif member is not None:
                start_time = time.time()
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw).convert("L")

                with BytesIO() as image_bytes:
                    image.save(image_bytes, 'jpeg')
                    image_bytes.seek(0)
                    embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                          description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                          timestamp=interaction.created_at)
                    embed.set_image(url="attachment://black_and_white.jpeg")
                    runtime = time.time() - start_time
                    embed.set_footer(text=f"Image took {runtime.__format__('0.2f')} sec(s) to generate",
                                     icon_url=interaction.user.display_avatar)
                    file_obj = discord.File(fp=image_bytes, filename="black_and_white.jpeg")
                    await interaction.response.send_message(embed=embed, view=view, file=file_obj)

            elif attachment is not None:
                start_time = time.time()
                image_url = attachment.url
                image = Image.open(requests.get(url=str(image_url), stream=True).raw).convert("L")

                with BytesIO() as image_bytes:
                    image.save(image_bytes, 'jpeg')
                    image_bytes.seek(0)
                    embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                          description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                          timestamp=interaction.created_at)
                    embed.set_image(url="attachment://black_and_white.jpeg")
                    runtime = time.time() - start_time
                    embed.set_footer(text=f"Image took {runtime.__format__('0.2f')} sec(s) to generate",
                                     icon_url=interaction.user.display_avatar)
                    file_obj = discord.File(fp=image_bytes, filename="black_and_white.jpeg")
                    await interaction.response.send_message(embed=embed, view=view, file=file_obj)

            elif attachment is None and member is None:
                start_time = time.time()
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw).convert("L")

                with BytesIO() as image_bytes:
                    image.save(image_bytes, 'jpeg')
                    image_bytes.seek(0)
                    embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                          description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                          timestamp=interaction.created_at)
                    embed.set_image(url="attachment://black_and_white.jpeg")
                    runtime = time.time() - start_time
                    embed.set_footer(text=f"Image took {runtime.__format__('0.2f')} sec(s) to generate",
                                     icon_url=interaction.user.display_avatar)
                    file_obj = discord.File(fp=image_bytes, filename="black_and_white.jpeg")
                    await interaction.response.send_message(embed=embed, view=view, file=file_obj)

        except:
            error_logger.error("An error occurred while running b_w image command:- ", exc_info=True)

    @app_commands.command(name="negative", description="Gives a negative version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def negative(self, interaction: discord.Interaction, member: discord.Member = None,
                       attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.invert(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://negative.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"negative.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.invert(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://negative.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"negative.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.invert(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://negative.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"negative.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running negative image command:- ", exc_info=True)

    @app_commands.command(name="pixel", description="Gives a pixelated version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def pixel(self, interaction: discord.Interaction, member: discord.Member = None,
                    attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.pixel(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://pixel.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"pixel.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.pixel(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://pixel.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"pixel.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.pixel(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://pixel.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"pixel.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running pixel image command:- ", exc_info=True)

    @app_commands.command(name="colors", description="Gives the constituent colors of the image.")
    @app_commands.describe(
        member="The member's avatar whose color info you want to get",
        attachment="The image file whose color info you want to get"
    )
    async def colors(self, interaction: discord.Interaction, member: discord.Member = None,
                     attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.colors(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://colors.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"colors.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.colors(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://colors.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"colors.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.colors(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://colors.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"colors.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running colors image command:- ", exc_info=True)

    @app_commands.command(name="triggered", description="Gives the image edited into a triggered GIF.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def triggered(self, interaction: discord.Interaction, member: discord.Member = None,
                        attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.triggered(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://triggered.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"triggered.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.triggered(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://triggered.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"triggered.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.triggered(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://negative.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"triggered.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running triggered image command:- ", exc_info=True)

    @app_commands.command(name="expand", description="Gives an expanded version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def expand(self, interaction: discord.Interaction, member: discord.Member = None,
                     attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.expand(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://expand.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"expand.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.expand(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://expand.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"expand.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.expand(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://expand.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"expand.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running expand image command:- ", exc_info=True)

    @app_commands.command(name="wasted", description="Gives a wasted version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def wasted(self, interaction: discord.Interaction, member: discord.Member = None,
                     attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.wasted(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://wasted.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"wasted.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.wasted(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://wasted.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"wasted.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.wasted(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://wasted.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"wasted.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running wasted image command:- ", exc_info=True)

    @app_commands.command(name="petpat", description="Gives a petpat version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def petpat(self, interaction: discord.Interaction, member: discord.Member = None,
                     attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.petpet(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://petpat.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"petpat.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.petpet(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://petpat.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"petpat.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.petpet(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://petpat.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"petpat.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running petpat image command:- ", exc_info=True)

    @app_commands.command(name="bonk", description="Gives a bonked version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def bonk(self, interaction: discord.Interaction, member: discord.Member = None,
                   attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.bonk(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://bonk.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"bonk.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.bonk(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://bonk.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"bonk.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.bonk(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://bonk.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"bonk.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running bonk image command:- ", exc_info=True)

    @app_commands.command(name="hog", description="Gives a histogram of oriented gradients of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def hog(self, interaction: discord.Interaction, member: discord.Member = None,
                  attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.hog(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://hog.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"hog.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.hog(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://hog.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"hog.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.hog(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://hog.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"hog.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running hog image command:- ", exc_info=True)

    @app_commands.command(name="blur", description="Gives a blurred version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit",
        blur_radius="The intensity of the blur in int"
    )
    async def blur(self, interaction: discord.Interaction, blur_radius: int, member: discord.Member = None,
                   attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                start_time = time.time()
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                blurred_image = image.filter(ImageFilter.GaussianBlur(radius=blur_radius))

                with BytesIO() as image_bytes:
                    blurred_image.save(image_bytes, 'jpeg')
                    image_bytes.seek(0)
                    embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                          description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                          timestamp=interaction.created_at)
                    embed.set_image(url=f"attachment://blur.jpeg")
                    runtime = time.time() - start_time
                    embed.set_footer(text=f"Image took {runtime.__format__('0.2f')} sec(s) to generate",
                                     icon_url=interaction.user.display_avatar)
                    file_obj = discord.File(fp=image_bytes, filename=f"blur.jpeg")

                    await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                start_time = time.time()
                image_url = attachment.url
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                blurred_image = image.filter(ImageFilter.GaussianBlur(radius=blur_radius))

                with BytesIO() as image_bytes:
                    blurred_image.save(image_bytes, 'jpeg')
                    image_bytes.seek(0)
                    embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                          description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                          timestamp=interaction.created_at)
                    embed.set_image(url=f"attachment://blur.jpeg")
                    runtime = time.time() - start_time
                    embed.set_footer(text=f"Image took {runtime.__format__('0.2f')} sec(s) to generate",
                                     icon_url=interaction.user.display_avatar)
                    file_obj = discord.File(fp=image_bytes, filename=f"blur.jpeg")

                    await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                start_time = time.time()
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                blurred_image = image.filter(ImageFilter.GaussianBlur(radius=blur_radius))

                with BytesIO() as image_bytes:
                    blurred_image.save(image_bytes, 'jpeg')
                    image_bytes.seek(0)
                    embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                          description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                          timestamp=interaction.created_at)
                    embed.set_image(url=f"attachment://blur.jpeg")
                    runtime = time.time() - start_time
                    embed.set_footer(text=f"Image took {runtime.__format__('0.2f')} sec(s) to generate",
                                     icon_url=interaction.user.display_avatar)
                    file_obj = discord.File(fp=image_bytes, filename=f"blur.jpeg")

                    await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running blur image command:- ", exc_info=True)

    @app_commands.command(name="rgb", description="Gives a rgb graph of the image's colors.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def rgb(self, interaction: discord.Interaction, member: discord.Member = None,
                  attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.rgb(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://rgb.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"rgb.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.rgb(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://rgb.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"rgb.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.rgb(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://rgb.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"rgb.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running rgb image command:- ", exc_info=True)

    @app_commands.command(name="lego", description="Gives a lego version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def lego(self, interaction: discord.Interaction, member: discord.Member = None,
                   attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.lego(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://lego.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"lego.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.lego(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://lego.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"lego.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.lego(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://lego.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"lego.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running lego image command:- ", exc_info=True)

    @app_commands.command(name="album", description="Gives a music album version of the image.")
    @app_commands.describe(
        member="The member's avatar which you want to edit",
        attachment="The image file which you want to edit"
    )
    async def album(self, interaction: discord.Interaction, member: discord.Member = None,
                    attachment: discord.Attachment = None):
        await interaction.response.defer()
        view = DeleteButton()
        try:
            if attachment is not None and member is not None:
                await interaction.followup.send(
                    "<a:alert:997769654141452359> You can give only one option at once!")

            elif member is not None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.album(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://album.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"album.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is not None:
                image_url = attachment.url
                img = await self.dagpi.image_process(ImageFeatures.album(), url=str(image_url))
                image = Image.open(requests.get(url=str(image_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> <:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://album.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"album.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

            elif attachment is None and member is None:
                member = member or interaction.user
                avatar_url = member.avatar.with_format('jpeg')
                img = await self.dagpi.image_process(ImageFeatures.album(), url=str(avatar_url))
                image = Image.open(requests.get(url=str(avatar_url), stream=True).raw)
                embed = discord.Embed(title="<:photo:995519248006905896> Formatted Image", color=discord.Color.blurple(),
                                      description=f"*Height - {image.height} px\nWidth - {image.width} px*",
                                      timestamp=interaction.created_at)
                embed.set_image(url=f"attachment://album.{img.format}")
                embed.set_footer(text=f"Image took {img.process_time} sec(s) to generate",
                                 icon_url=interaction.user.display_avatar)
                file_obj = discord.File(fp=img.image, filename=f"album.{img.format}")
                await interaction.followup.send(embed=embed, file=file_obj, view=view)

        except:
            error_logger.error("An error occurred while running album image command:- ", exc_info=True)


async def setup(client):
    await client.add_cog(ImageManipulation(client))