Skip to content

Commit

Permalink
Add icon generator functionality with caching and cache clearing
Browse files Browse the repository at this point in the history
  • Loading branch information
nottherealtar committed Dec 20, 2024
1 parent f3d0963 commit 3de920b
Show file tree
Hide file tree
Showing 2 changed files with 172 additions and 58 deletions.
182 changes: 124 additions & 58 deletions howcracked/howcracked.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
#
# _ _ ___ _____ _____ _ _ _____ ____ _____ _ _ _____ _ ____
# | \ | |/ _ \_ _|_ _| | | | ____| _ \| ____| / \ | | |_ _|/ \ | _ \
# | \| | | | || | | | | |_| | _| | |_) | _| / _ \ | | | | / _ \ | |_) |
# | |\ | |_| || | | | | _ | |___| _ <| |___ / ___ \| |___| |/ ___ \| _ <
# |_| \_|\___/ |_| |_| |_| |_|_____|_| \_\_____/_/ \_\_____|_/_/ \_\_| \_\
#

from redbot.core import commands, Config
from discord import Embed, User
from discord import Embed, User, File
import random
from datetime import datetime
from .icon_generator import generate_icon, clear_icon_cache

class HowCracked(commands.Cog):
def __init__(self, bot):
Expand All @@ -21,6 +14,12 @@ def __init__(self, bot):
}
self.config.register_global(**default_global)

def get_cracked_percentage(self):
"""
Generate a random cracked percentage with a controlled distribution.
"""
return random.uniform(0, 100)

@commands.command()
@commands.cooldown(1, 86400, commands.BucketType.user) # 86400 seconds = 1 day
async def howcracked(self, ctx, user: User = None):
Expand All @@ -38,6 +37,16 @@ async def howcracked(self, ctx, user: User = None):
"Un-Cracked",
"Butt-Crack-ed",
"On-Crack",
"Barely Cracked",
"Slightly Cracked",
"Moderately Cracked",
"Highly Cracked",
"Extremely Cracked",
"Insanely Cracked",
"Godly Cracked",
"Legendary Cracked",
"Mythical Cracked",
"Ultimate Cracked",
]

emojis = ["💯", "😎", "🔥", "🤯", "👀"]
Expand All @@ -54,26 +63,23 @@ async def howcracked(self, ctx, user: User = None):
"Crack-Head",
"Intellect",
"Rizz",
"Barely Nimble",
"Slightly Strong",
"Moderately Intelligent",
"Highly Psychic",
"Extremely Telekinetic",
"Insanely Nimble",
"Godly Strong",
"Legendary Intelligent",
"Mythical Psychic",
"Ultimate Telekinetic",
]

# Define gifs for each power level
gifs = {
"Ultra Mega Super Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1231326884495626391/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f776174747061642d6d656469612d736572766963652f53746f7279496d6167652f416c796550784f326367616f65513d3d2d313335323730343938352e3137363939386662303861383332333039.gif?ex=66368d86&is=66241886&hm=bd2e0f5356674cc86e8bdd2756bdab54dd57606653e5d0a015de5424e5a1986f&",
"Super Duper Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1231324806297682059/monkey-d-luffy-straw-hat-luffy.gif?ex=66368b96&is=66241696&hm=09496efa42a3abd479ae6f3184fbe0abaec57e01a9550f9a7e96349b368a8b51&",
"Mega Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1231324623891861565/kermit-dragonballz.gif?ex=66368b6b&is=6624166b&hm=c47b1379fb442ed31ab65787d64abf14fdb9285e0b2b65cae9a0f4cefcf6b97d&",
"Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1237131977724006501/tenor.gif?ex=663a8870&is=663936f0&hm=36c9273b74b8238e8c960ab4c2e1594d68c68b9bda67a2b6e409047737f88f36&",
"Kinda Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1231323970784202842/dont-know-why-i-was-reminded-of-those-10-year-old-kids-who-studies-coding-weight.gif?ex=66368acf&is=662415cf&hm=67af041bf0de0f0cfbda84f0a33d5a2ef971833ada5b22bda5ea8848c8c9b0e0&",
"Not So Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1231323783676170370/try-to-get-up-zayto.gif?ex=66368aa2&is=662415a2&hm=a9a7c4f273fbf2ea4e51018df15bd7a8ee33747a1d616de3b096ef708951222e&",
"Un-Cracked": "https://cdn.discordapp.com/attachments/1170989523895865424/1231323312471146506/duct-tape-this-is-the-end.gif?ex=66368a32&is=66241532&hm=5b1b732ff4c8eedc413cafea340ba90aae625dba56b751535eb913e26cbb71e4&",
"Butt-Crack-ed": "https://cdn.discordapp.com/attachments/1170989523895865424/1231322898015191040/homer-simpson.gif?ex=663689cf&is=662414cf&hm=94ebbbb21c9a16cfea87d5e05b112d056bfec370dacb345413b504c99802106e&",
"On-Crack": "https://cdn.discordapp.com/attachments/1170989523895865424/1231323348445692004/IMG_2579.gif?ex=662566bb&is=6624153b&hm=82eaa02dfd5d734e577a5d5c38c9dca571b44c3812f6660a1e0a3ea8e5ad6896&",
}

# Get the user to rate
target_user = user or ctx.author

# Generate a random cracked percentage
cracked_percentage = random.uniform(0, 100)
cracked_percentage = self.get_cracked_percentage()

# Update the record if necessary
highest = await self.config.highest()
Expand All @@ -87,57 +93,126 @@ async def howcracked(self, ctx, user: User = None):

# Determine the cool power level based on the percentage
power_level = None
if cracked_percentage < 7:
if cracked_percentage < 5:
power_level = "On-Crack"
elif cracked_percentage < 25:
elif cracked_percentage < 10:
power_level = "Butt-Crack-ed"
elif cracked_percentage < 15:
power_level = "Un-Cracked"
elif cracked_percentage < 20:
power_level = "Not So Cracked"
elif cracked_percentage < 50:
elif cracked_percentage < 25:
power_level = "Kinda Cracked"
elif cracked_percentage < 75:
elif cracked_percentage < 30:
power_level = "Barely Cracked"
elif cracked_percentage < 35:
power_level = "Slightly Cracked"
elif cracked_percentage < 40:
power_level = "Moderately Cracked"
elif cracked_percentage < 50:
power_level = "Cracked"
elif cracked_percentage < 90:
elif cracked_percentage < 60:
power_level = "Highly Cracked"
elif cracked_percentage < 70:
power_level = "Mega Cracked"
elif cracked_percentage < 97:
elif cracked_percentage < 80:
power_level = "Extremely Cracked"
elif cracked_percentage < 90:
power_level = "Super Duper Cracked"
elif cracked_percentage < 95:
power_level = "Insanely Cracked"
elif cracked_percentage < 97:
power_level = "Godly Cracked"
elif cracked_percentage < 99:
power_level = "Legendary Cracked"
elif cracked_percentage < 100:
power_level = "Mythical Cracked"
else:
power_level = "Ultra Mega Super Cracked"

# Determine the cool ability level based on the percentage
ability_level = None
if cracked_percentage < 7:
if cracked_percentage < 5:
ability_level = "Crack-Head"
elif cracked_percentage < 25:
elif cracked_percentage < 10:
ability_level = "Un-coordinated"
elif cracked_percentage < 50:
elif cracked_percentage < 15:
ability_level = "Not So Nimble"
elif cracked_percentage < 75:
elif cracked_percentage < 20:
ability_level = "Mildly Psychic"
elif cracked_percentage < 90:
elif cracked_percentage < 25:
ability_level = "Slightly Telekinetic"
elif cracked_percentage < 30:
ability_level = "Barely Nimble"
elif cracked_percentage < 35:
ability_level = "Slightly Strong"
elif cracked_percentage < 40:
ability_level = "Moderately Intelligent"
elif cracked_percentage < 50:
ability_level = "Highly Psychic"
elif cracked_percentage < 60:
ability_level = "Extremely Telekinetic"
elif cracked_percentage < 70:
ability_level = "Insanely Nimble"
elif cracked_percentage < 80:
ability_level = "Godly Strong"
elif cracked_percentage < 90:
ability_level = "Legendary Intelligent"
elif cracked_percentage < 95:
ability_level = "Mythical Psychic"
elif cracked_percentage < 97:
ability_level = "Mega Intelligent"
ability_level = "Ultimate Telekinetic"
else:
ability_level = "Ultra Mega Super Charismatic"

# Generate or retrieve the icon
icon_path = generate_icon(power_level)

# Build the embed
embed = Embed(title=f"How Cracked is {target_user.name}?", color=0x00ff00)
embed.description = f"{target_user.mention} is {power_level}! {cracked_percentage:.2f}% {ability_level} {random.choice(emojis)}"

# Check if the gif URL exists for the power level
gif_url = gifs.get(power_level)
if gif_url:
embed.set_image(url=gif_url) # Add the gif
else:
print(f"No gif found for power level: {power_level}")

embed.set_image(url=f"attachment://{os.path.basename(icon_path)}")
embed.set_footer(text="Powered by the Cracked-o-Meter and Goku")

# Send the embed
await ctx.send(embed=embed)

# Send the embed with the icon
await ctx.send(embed=embed, file=File(icon_path))

@commands.command()
@commands.is_owner()
async def generate_icons(self, ctx):
"""
Generate RPG-style icons for all levels.
"""
levels = [
"On-Crack", "Butt-Crack-ed", "Un-Cracked", "Not So Cracked", "Kinda Cracked",
"Barely Cracked", "Slightly Cracked", "Moderately Cracked", "Highly Cracked",
"Extremely Cracked", "Insanely Cracked", "Godly Cracked", "Legendary Cracked",
"Mythical Cracked", "Ultimate Cracked", "Ultra Mega Super Cracked"
]
for level in levels:
generate_icon(level)
await ctx.send("Icons generated and cached successfully.")

@commands.command()
@commands.is_owner()
async def regenerate_icons(self, ctx):
"""
Regenerate RPG-style icons for all levels.
"""
levels = [
"On-Crack", "Butt-Crack-ed", "Un-Cracked", "Not So Cracked", "Kinda Cracked",
"Barely Cracked", "Slightly Cracked", "Moderately Cracked", "Highly Cracked",
"Extremely Cracked", "Insanely Cracked", "Godly Cracked", "Legendary Cracked",
"Mythical Cracked", "Ultimate Cracked", "Ultra Mega Super Cracked"
]
clear_icon_cache()
for level in levels:
generate_icon(level)
await ctx.send("Icons regenerated and cached successfully.")

def is_owner(ctx):
return ctx.bot.is_owner(ctx.author) or (ctx.guild is not None and ctx.guild.owner_id == ctx.author.id)

@commands.command()
@commands.check(is_owner)
async def clearrecords(self, ctx):
Expand All @@ -153,10 +228,7 @@ async def clearrecords(self, ctx):
async def on_command_error(self, ctx, error):
if isinstance(error, commands.CheckFailure):
await ctx.send("You do not have the necessary permissions to run this command.")

# Record command to display the highest or lowest cracked record



@commands.command()
async def record(self, ctx, record_type: str):
if record_type not in ["highest", "lowest"]:
Expand All @@ -168,18 +240,12 @@ async def record(self, ctx, record_type: str):
await ctx.send(f"No {record_type} record found.")
return

if record_type == "highest":
record_date = datetime.fromtimestamp(record['time'])
elif record_type == "lowest":
record_date = datetime.fromtimestamp(record['time'])
record_date = datetime.fromtimestamp(record['time'])
days_since_record = (datetime.utcnow() - record_date).days

embed = Embed(title=f"{record_type.capitalize()} Cracked Record 😎", color=0x00ff00)
embed.description = f"**{record['user']}** holds the record for the **{record_type}** cracked percentage with *{record['percentage']:.2f}%* 🔥 for `{days_since_record}` days ⌛"
await ctx.send(embed=embed)

def is_owner(ctx):
return ctx.bot.is_owner(ctx.author) or (ctx.guild is not None and ctx.guild.owner_id == ctx.author.id)

# Required to make the cog load
def setup(bot):
Expand Down
48 changes: 48 additions & 0 deletions howcracked/icon_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from PIL import Image, ImageDraw, ImageFont
import os
from functools import lru_cache
from datetime import datetime

@lru_cache(maxsize=100)
def generate_icon(level):
"""
Generate an RPG-style icon for the given level.
"""
# Define icon size and colors
size = (100, 100)
background_color = (255, 255, 255)
text_color = (0, 0, 0)

# Create a blank image
image = Image.new('RGB', size, background_color)
draw = ImageDraw.Draw(image)

# Load a font
font = ImageFont.load_default()

# Draw text
text = level[:2] # Use first 2 letters of the level for simplicity
text_width, text_height = draw.textsize(text, font=font)
text_position = ((size[0] - text_width) / 2, (size[1] - text_height) / 2)
draw.text(text_position, text, fill=text_color, font=font)

# Save the image to a temporary file
temp_dir = "icons_cache"
os.makedirs(temp_dir, exist_ok=True)
timestamp = datetime.utcnow().strftime("%Y%m%d%H%M%S%f")
file_path = os.path.join(temp_dir, f"{level}_{timestamp}.png")
image.save(file_path)

return file_path

def clear_icon_cache():
"""
Clear the icon cache.
"""
generate_icon.cache_clear()
temp_dir = "icons_cache"
if os.path.exists(temp_dir):
for file in os.listdir(temp_dir):
file_path = os.path.join(temp_dir, file)
if os.path.isfile(file_path):
os.unlink(file_path)

0 comments on commit 3de920b

Please sign in to comment.