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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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( " 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))