college-bot-v1/cogs/extremism.py

102 lines
3 KiB
Python
Raw Normal View History

2023-09-21 19:25:01 +01:00
# You have been warned - this file is very EXTREME!
import discord
import asyncio
2023-09-21 20:07:22 +01:00
import io
import numpy
import blend_modes
2023-09-21 19:25:01 +01:00
from functools import partial
from discord.ext import commands
import PIL.Image
2023-09-21 20:07:22 +01:00
from PIL import Image
def _overlay_images(
background: PIL.Image.Image,
foreground: PIL.Image.Image,
mode=blend_modes.overlay,
opacity: float = 1.0
) -> PIL.Image.Image:
background = background.convert("RGBA")
foreground = foreground.convert("RGBA")
background.load()
foreground.load()
background_img = numpy.array(background)
background_img_float = background_img.astype(float)
foreground_img = numpy.array(foreground)
foreground_img_float = foreground_img.astype(float)
blended_img_float = mode(background_img_float, foreground_img_float, opacity)
blended_img = numpy.uint8(blended_img_float)
return PIL.Image.fromarray(blended_img)
2023-09-21 19:25:01 +01:00
def overlay_logo(img: PIL.Image.Image) -> PIL.Image.Image:
"""Overlay the logo on an image."""
2023-09-21 20:07:22 +01:00
# clone the image
img = img.copy()
logo = PIL.Image.open("assets/extreme.png")
logo.convert("RGBA")
logo.load()
2023-09-21 19:25:01 +01:00
logo = logo.resize((1024, 1024))
img = img.resize((1024, 1024))
2023-10-30 18:40:44 +00:00
2023-09-21 20:24:58 +01:00
img = _overlay_images(img, logo, blend_modes.lighten_only, 1)
2023-09-21 20:07:22 +01:00
return img
2023-09-21 19:25:01 +01:00
def overlay_purple(img: PIL.Image.Image) -> PIL.Image.Image:
"""Overlay the purple on an image."""
# purple_overlay_rgb = 0x440099
2023-09-21 20:07:22 +01:00
purple_overlay_rgba = (68, 0, 153)
2023-09-21 19:25:01 +01:00
# Create the overlay image
overlay = PIL.Image.new("RGBA", img.size, purple_overlay_rgba)
# resize to 1024x1024
2023-09-21 20:07:22 +01:00
img = img.copy().resize((1024, 1024))
2023-09-21 19:25:01 +01:00
overlay = overlay.resize((1024, 1024))
2023-09-21 20:07:22 +01:00
img = _overlay_images(img, overlay)
return img
2023-09-21 19:25:01 +01:00
def extremify(img: PIL.Image.Image) -> PIL.Image.Image:
"""Apply the EXTREME effect to an image."""
img = overlay_purple(img)
2023-09-21 20:07:22 +01:00
img = overlay_logo(img)
2023-09-21 19:25:01 +01:00
return img
class Extremism(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.slash_command(name="radicalise")
2023-09-21 20:08:27 +01:00
async def radicalise(self, ctx, image: discord.Attachment = None, user: discord.User = None):
2023-09-21 19:25:01 +01:00
"""Makes an image extremely radical."""
2023-09-21 20:08:27 +01:00
if image is None:
if user is None:
user = ctx.author
image = user.avatar.with_format("png")
else:
if not image.content_type.startswith("image/"):
await ctx.send("That's not an image!")
return
2023-09-21 19:25:01 +01:00
await ctx.defer()
# Download the image
_img_bytes = await image.read()
# Open the image
2023-09-21 20:07:22 +01:00
img = PIL.Image.open(io.BytesIO(_img_bytes))
2023-09-21 19:25:01 +01:00
# Apply the EXTREME effect
img = await asyncio.to_thread(extremify, img)
# Save the image
img_bytes = io.BytesIO()
img.save(img_bytes, format="PNG")
img_bytes.seek(0)
# Send the image
await ctx.respond(file=discord.File(img_bytes, filename="extreme.png"))
def setup(bot):
bot.add_cog(Extremism(bot))