Image.py

← Back to explorer
Cogs/ Image.py
Raw
Python 882 lines · UTF-8
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
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))