From 81b3abf287327773bd704e3cd9ace0de2bd2a530 Mon Sep 17 00:00:00 2001 From: WhatDidYouExpect <89535984+WhatDidYouExpect@users.noreply.github.com> Date: Wed, 16 Jul 2025 01:32:38 +0200 Subject: [PATCH] duct tape fix for cogmanager and tested using the image module inside of a cog --- assets/cogs/cogmanager.py | 11 +++-- assets/cogs/fuckup.py | 97 +++++++++++++++++++++++++++++++++++++++ modules/coghooks.py | 51 ++++++++++++++++++++ 3 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 assets/cogs/fuckup.py create mode 100644 modules/coghooks.py diff --git a/assets/cogs/cogmanager.py b/assets/cogs/cogmanager.py index 3bddc5f..017f021 100644 --- a/assets/cogs/cogmanager.py +++ b/assets/cogs/cogmanager.py @@ -1,8 +1,9 @@ import discord from discord.ext import commands -import os from modules.globalvars import ownerid +COG_PREFIX = "assets.cogs." + class CogManager(commands.Cog): def __init__(self, bot): self.bot = bot @@ -16,7 +17,7 @@ class CogManager(commands.Cog): await ctx.send("Please provide the cog name to load.") return try: - await self.bot.load_extension(f"cogs.{cog_name}") + await self.bot.load_extension(COG_PREFIX + cog_name) await ctx.send(f"Loaded cog `{cog_name}` successfully.") except Exception as e: await ctx.send(f"Error loading cog `{cog_name}`: {e}") @@ -30,7 +31,7 @@ class CogManager(commands.Cog): await ctx.send("Please provide the cog name to unload.") return try: - await self.bot.unload_extension(f"cogs.{cog_name}") + await self.bot.unload_extension(COG_PREFIX + cog_name) await ctx.send(f"Unloaded cog `{cog_name}` successfully.") except Exception as e: await ctx.send(f"Error unloading cog `{cog_name}`: {e}") @@ -44,8 +45,8 @@ class CogManager(commands.Cog): await ctx.send("Please provide the cog name to reload.") return try: - await self.bot.unload_extension(f"cogs.{cog_name}") - await self.bot.load_extension(f"cogs.{cog_name}") + await self.bot.unload_extension(COG_PREFIX + cog_name) + await self.bot.load_extension(COG_PREFIX + cog_name) await ctx.send(f"Reloaded cog `{cog_name}` successfully.") except Exception as e: await ctx.send(f"Error reloading cog `{cog_name}`: {e}") diff --git a/assets/cogs/fuckup.py b/assets/cogs/fuckup.py new file mode 100644 index 0000000..0540f09 --- /dev/null +++ b/assets/cogs/fuckup.py @@ -0,0 +1,97 @@ +import discord +from discord.ext import commands +from modules.image import * +from PIL import Image, ImageEnhance, ImageFilter, ImageOps, ImageChops, ImageColor +import os, random, shutil, tempfile + +async def deepfryimage(path): + with Image.open(path).convert("RGB") as im: + # make it burn + for _ in range(3): + im = im.resize((int(im.width * 0.7), int(im.height * 0.7))) + im = im.resize((int(im.width * 1.5), int(im.height * 1.5))) + im = ImageEnhance.Contrast(im).enhance(random.uniform(5, 10)) + im = ImageEnhance.Sharpness(im).enhance(random.uniform(10, 50)) + im = ImageEnhance.Brightness(im).enhance(random.uniform(1.5, 3)) + r, g, b = im.split() + r = r.point(lambda i: min(255, i * random.uniform(1.2, 2.0))) + g = g.point(lambda i: min(255, i * random.uniform(0.5, 1.5))) + b = b.point(lambda i: min(255, i * random.uniform(0.5, 2.0))) + channels = [r, g, b] + random.shuffle(channels) + im = Image.merge("RGB", tuple(channels)) + overlay_color = tuple(random.randint(0, 255) for _ in range(3)) + overlay = Image.new("RGB", im.size, overlay_color) + im = ImageChops.add(im, overlay, scale=2.0, offset=random.randint(-64, 64)) + + im = im.filter(ImageFilter.EDGE_ENHANCE_MORE) + im = im.filter(ImageFilter.GaussianBlur(radius=random.uniform(0.5, 2))) + for _ in range(3): + tmp_path = tempfile.mktemp(suffix=".jpg") + im.save(tmp_path, format="JPEG", quality=random.randint(5, 15)) + im = Image.open(tmp_path) + if random.random() < 0.3: + im = ImageOps.posterize(im, bits=random.choice([2, 3, 4])) + if random.random() < 0.2: + im = ImageOps.invert(im) + out_path = tempfile.mktemp(suffix=".jpg") + im.save(out_path, format="JPEG", quality=5) + return out_path + + +class whami(commands.Cog): + def __init__(self, bot): + self.bot = bot + + + @commands.command() + async def fuckup(self, ctx): + assets_folder = "assets/images" + temp_input = None + + def get_random_asset_image(): + files = [f for f in os.listdir(assets_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))] + if not files: + return None + return os.path.join(assets_folder, random.choice(files)) + + if ctx.message.attachments: + attachment = ctx.message.attachments[0] + if attachment.content_type and attachment.content_type.startswith("image/"): + ext = os.path.splitext(attachment.filename)[1] + temp_input = f"tempy{ext}" + await attachment.save(temp_input) + input_path = temp_input + else: + fallback_image = get_random_asset_image() + if fallback_image is None: + await ctx.reply(_('no_image_available')) + return + temp_input = tempfile.mktemp(suffix=os.path.splitext(fallback_image)[1]) + shutil.copy(fallback_image, temp_input) + input_path = temp_input + else: + fallback_image = get_random_asset_image() + if fallback_image is None: + await ctx.reply(_('no_image_available')) + return + temp_input = tempfile.mktemp(suffix=os.path.splitext(fallback_image)[1]) + shutil.copy(fallback_image, temp_input) + input_path = temp_input + + output_path = await gen_meme(input_path) + + if output_path is None or not os.path.isfile(output_path): + if temp_input and os.path.exists(temp_input): + os.remove(temp_input) + await ctx.reply(_('failed_generate_image')) + return + + deepfried_path = await deepfryimage(output_path) + await ctx.send(file=discord.File(deepfried_path)) + + if temp_input and os.path.exists(temp_input): + os.remove(temp_input) + +async def setup(bot): + await bot.add_cog(whami(bot)) diff --git a/modules/coghooks.py b/modules/coghooks.py new file mode 100644 index 0000000..ab56339 --- /dev/null +++ b/modules/coghooks.py @@ -0,0 +1,51 @@ +import os +import importlib +import inspect +import sys + +_hooks = {} + +def register_hook(name, func): + if name not in _hooks: + _hooks[name] = [] + _hooks[name].append(func) + +async def call_hook(name, *args, **kwargs): + if name not in _hooks: + return + for func in _hooks[name]: + if callable(func): + if inspect.iscoroutinefunction(func): + await func(*args, **kwargs) + else: + func(*args, **kwargs) + +def register_all_functions_as_hooks(module): + """Register every function/coroutine function in the given module as a hook under its function name.""" + for name, obj in inspect.getmembers(module): + if inspect.isfunction(obj) or inspect.iscoroutinefunction(obj): + register_hook(name, obj) + +def _register_all_modules_functions(): + """Scan all python modules in this 'modules' folder (excluding this file) and register their functions.""" + # Calculate the path to the modules directory relative to this file + modules_dir = os.path.dirname(os.path.abspath(__file__)) + + # Current file name so we skip it + current_file = os.path.basename(__file__) + + # Ensure 'modules' is in sys.path for importlib to work + if modules_dir not in sys.path: + sys.path.insert(0, modules_dir) + + # List all python files except dunder files and this file + for filename in os.listdir(modules_dir): + if filename.endswith(".py") and not filename.startswith("__") and filename != current_file: + module_name = filename[:-3] # strip .py extension + try: + module = importlib.import_module(module_name) + register_all_functions_as_hooks(module) + except Exception as e: + print(f"[hooks] Failed to import {module_name}: {e}") + +