# blush cry dance lewd pout shrug sleepy smile smug thumbsup wag thinking triggered teehee deredere thonking scoff happy thumbs grin import discord from discord.ext import commands from utils import sql_commands as mydb from random import choice class Emotes(commands.Cog): def __init__(self, client): self.client = client self.emotes = { "blush": ["https://media.giphy.com/media/3o6Zt6ML6BklcajjsA/giphy.gif"], "cry": ["https://media.giphy.com/media/ROF8OQvDmxytW/giphy.gif"], "dance": ["https://media.giphy.com/media/l0MYt5jPR6QX5pnqM/giphy.gif"], # ...add more emotes... } self.emote_packs = { "happy": ["smile", "grin", "thumbsup"], "sleepy": ["sleepy", "yawn"], # ...add more packs... } self.cooldowns = {} # {user_id: {emote: timestamp}} self.emote_usage = {} # {user_id: {emote: count}} self.unlocked_emotes = {} # {user_id: set(emote_names)} self.pending_emotes = [] # [(user_id, emote_name, url)] # --- Emote Command for Each Emote --- @commands.command(name="emote") async def emote(self, ctx, emote_name: str, member: discord.Member = None): """Send an emote GIF, optionally mentioning a user.""" emote = emote_name.lower() # Economy/level check if emote not in self.emotes and emote not in self.get_custom_emotes(): await ctx.send("Unknown emote.") return if not self.has_unlocked(ctx.author.id, emote): await ctx.send("You haven't unlocked this emote yet!") return # Cooldown check (10s per emote per user) import time now = time.time() user_cooldowns = self.cooldowns.setdefault(ctx.author.id, {}) if emote in user_cooldowns and now - user_cooldowns[emote] < 10: await ctx.send("You're using that emote too quickly!") return user_cooldowns[emote] = now # Usage tracking user_usage = self.emote_usage.setdefault(ctx.author.id, {}) user_usage[emote] = user_usage.get(emote, 0) + 1 url = choice(self.emotes.get(emote, self.get_custom_emotes().get(emote, [""]))) mention = member.mention if member else "" await ctx.send( f"{ctx.author.mention} {mention}", embed=discord.Embed().set_image(url=url) ) # --- Individual Emote Commands (e.g., !blush, !cry, !dance) --- # Dynamically add a command for each emote def __init_subclass__(cls): def make_emote_cmd(emote): async def _cmd(self, ctx, member: discord.Member = None): await self.emote(ctx, emote, member) return _cmd for emote in ["blush", "cry", "dance"]: # Add all your emote names here setattr(cls, emote, commands.command(name=emote)(make_emote_cmd(emote))) # --- Emote Combos --- @commands.command(name="emotecombo") async def emote_combo(self, ctx, *emotes): """Send multiple emotes in one message.""" urls = [] for emote in emotes: if self.has_unlocked(ctx.author.id, emote) and ( emote in self.emotes or emote in self.get_custom_emotes() ): urls.append( choice( self.emotes.get( emote, self.get_custom_emotes().get(emote, [""]) ) ) ) if not urls: await ctx.send("No valid emotes found.") return for url in urls: embed = discord.Embed().set_image(url=url) await ctx.send(embed=embed) # --- Emote Packs --- @commands.command(name="emotepack") async def emote_pack(self, ctx, pack_name: str): """Send all emotes from a pack.""" pack = self.emote_packs.get(pack_name.lower()) if not pack: await ctx.send("Unknown emote pack.") return for emote in pack: if self.has_unlocked(ctx.author.id, emote) and ( emote in self.emotes or emote in self.get_custom_emotes() ): url = choice( self.emotes.get(emote, self.get_custom_emotes().get(emote, [""])) ) await ctx.send(embed=discord.Embed().set_image(url=url)) # --- Emote Leaderboard --- @commands.command(name="emoteleaderboard") async def emote_leaderboard(self, ctx): """Show top emote users.""" leaderboard = sorted( ((uid, sum(uses.values())) for uid, uses in self.emote_usage.items()), key=lambda x: x[1], reverse=True, )[:10] desc = "" for i, (uid, count) in enumerate(leaderboard, 1): user = self.client.get_user(uid) desc += f"{i}. {user.mention if user else uid}: {count} emotes\n" await ctx.send( embed=discord.Embed( title="Emote Leaderboard", description=desc or "No data." ) ) # --- Emote Reactions --- @commands.command(name="react") async def react(self, ctx, emote_name: str, message_id: int): """React to a message with an emote (as emoji if available).""" emote = emote_name.lower() try: msg = await ctx.channel.fetch_message(message_id) # If you have custom emoji, use them; else, fallback to unicode or skip await msg.add_reaction("😄") # Replace with actual emoji logic await ctx.send("Reacted!") except Exception: await ctx.send("Could not react to that message.") # --- Custom Emotes Submission --- @commands.command(name="submit_emote") async def submit_emote(self, ctx, emote_name: str, url: str): """Submit a custom emote for approval.""" self.pending_emotes.append((ctx.author.id, emote_name, url)) await ctx.send( f"Emote `{emote_name}` submitted for approval! (Admins: review pending list)" ) def get_custom_emotes(self): # In production, load from DB or approved list return {} # --- Unlock Emotes with Level/Economy --- @commands.command(name="unlock_emote") async def unlock_emote(self, ctx, emote_name: str): """Unlock an emote using currency or level.""" # Example: check user balance/level, deduct cost, unlock emote # Replace with your actual economy/level logic user_id = ctx.author.id unlocked = self.unlocked_emotes.setdefault(user_id, set()) unlocked.add(emote_name) await ctx.send(f"Emote `{emote_name}` unlocked!") def has_unlocked(self, user_id, emote_name): # Always unlocked for now, add logic for locked emotes return True async def setup(client): await client.add_cog(Emotes(client))