diff --git a/resources/files/counter.csv b/resources/files/counter.csv new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/resources/files/counter.csv @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/resources/files/grupos.txt b/resources/files/grupos.txt new file mode 100644 index 0000000..a1afbbc --- /dev/null +++ b/resources/files/grupos.txt @@ -0,0 +1,60 @@ +Imagine Dragons +Lil Nas X +Ed Sheeran +OneRepublic +Harry Styles +Mägo de Oz +Black Eyed Peas +Måneskin +BoyWithUke +Bad Bunny +Bizarrap +The Score +bbno$ +The Weeknd +Green Day +Queen +AC/DC +Elton John +Coldplay +LiSA +Glass Animals +Post Malone +KSI +Cardi B +JBalvin +Marshmello +Farruko +Dua Lipa +Ava Max +Armin van Buuren +Panic! At The Disco +Billie Eilish +Alan Walker +Bebe Rexha +Bruno Mars +Miley Cyrus +Maroon 5 +Tones And I +Why don't we +Ali Gatie +Canserbero +Residente +Dire Straits +Pink Floyd +Prince +The Police +Guns N' Roses +Linkin Park +Scorpion +Status Quo +Justin Bieber +Michael Jackson +Ariana Grande +Beyoncé +Lady Gaga +Katy Perry +Adele +Drake +Taylor Swift +Rihanna \ No newline at end of file diff --git a/resources/files/hugs.json b/resources/files/hugs.json new file mode 100644 index 0000000..e69de29 diff --git a/resources/files/juegos.txt b/resources/files/juegos.txt new file mode 100644 index 0000000..e01d4a4 --- /dev/null +++ b/resources/files/juegos.txt @@ -0,0 +1,60 @@ +Dishonored 2 +The Witness +Journey +Uncharted 2: Among Thieves +Overwatch +Apex Legends +Hollow Knig +Ms. Pac-Man +Counter-Strike 1.6 +Left 4 Dead 2 +EarthBound +Diablo II +StarCraft +World of Warcraft +Star Wars: Knights of the Old Republic +Fallout: New Vegas +Final Fantasy VI +Pokémon Yellow +Metroid Prime +The Elder Scrolls V: Skyrim +Resident Evil 4 +Shadow of the Colossus +The Last of Us Part 2 +Red Dead Redemption +Metal Gear Solid +Sid Meier's Civilization IV +The Legend of Zelda: Ocarina of Time +Minecraft +Halo: Combat Evolved +Half-Life +Final Fantasy XIV +Doom +Tetris +Metal Gear Solid 3: Snake Eater +Half-Life: Alyx +God of War +Chrono Trigger +Portal +Street Fighter II +Super Mario Bros. +Undertale +Bloodborne +BioShock +The Last of Us +The Witcher 3: Wild Hunt +Halo 2 +Castlevania: Symphony of the Night +Hades +Grand Theft Auto V +Super Mario Bros. 3 +Disco Elysium +Half-Life 2 +Red Dead Redemption 2 +Super Mario 64 +Mass Effect 2 +Super Metroid +The Legend of Zelda: A Link to the Past +Portal 2 +Super Mario World +The Legend of Zelda: Breath of the Wild \ No newline at end of file diff --git a/resources/files/shows.txt b/resources/files/shows.txt new file mode 100644 index 0000000..77f0137 --- /dev/null +++ b/resources/files/shows.txt @@ -0,0 +1,60 @@ +Squid Game +La Casa de Papel +Lupin +Avatar +Los Simpson +Lightyear +Tadeo Jones +Los Minions +Doraemon +Shin-Chan +JoJo's Bizarre Adventures +Boku no Hero Academia +Fullmetal Alchemist +SPY X FAMILY +Black Clover +My Dress-up Darling +New Amsterdam +Death Note +Cobra Kai +Karate Kid +Interstellar +Cómo entrenar a tu dragón +Free Guy +Spider Man +Dr Strange +Matrix +John Wick +Iron Man +The Good Doctor +Komi-san can't communicate +Big Mouth +(Des)encanto +Rick y Morty +Historias Corrientes +Hora de Aventuras +Chowder +Star Trek +Star Wars +Lost in Space +Tokyo Revengers +Gladiator +The Crown +Peaky Blinders +Sex Education +Enola Holmes +Los Juegos del Hambre +Juego de Tronos +El Señor de los Anillos +La princesa mononoke +Hitman +Los Croods +Plan de Escape +Código Lyoko +El Padrino +El viaje de Chihiro +El castillo ambulante +Coach Carter +Mascotas +Aida +La que se avecina \ No newline at end of file diff --git a/resources/files/warns.json b/resources/files/warns.json new file mode 100644 index 0000000..e69de29 diff --git a/resources/images/djpype.png b/resources/images/djpype.png new file mode 100644 index 0000000..3cdcd8b Binary files /dev/null and b/resources/images/djpype.png differ diff --git a/resources/images/interaction/beber.gif b/resources/images/interaction/beber.gif new file mode 100644 index 0000000..54d9cef Binary files /dev/null and b/resources/images/interaction/beber.gif differ diff --git a/resources/images/interaction/bombardeen.gif b/resources/images/interaction/bombardeen.gif new file mode 100644 index 0000000..777d5ca Binary files /dev/null and b/resources/images/interaction/bombardeen.gif differ diff --git a/resources/images/interaction/dale al play.webm b/resources/images/interaction/dale al play.webm new file mode 100644 index 0000000..b37a5ed Binary files /dev/null and b/resources/images/interaction/dale al play.webm differ diff --git a/resources/images/interaction/fbi.gif b/resources/images/interaction/fbi.gif new file mode 100644 index 0000000..2d3e17b Binary files /dev/null and b/resources/images/interaction/fbi.gif differ diff --git a/resources/images/interaction/femboy.png b/resources/images/interaction/femboy.png new file mode 100644 index 0000000..970e9fa Binary files /dev/null and b/resources/images/interaction/femboy.png differ diff --git a/resources/images/interaction/moan.gif b/resources/images/interaction/moan.gif new file mode 100644 index 0000000..5301d40 Binary files /dev/null and b/resources/images/interaction/moan.gif differ diff --git a/resources/images/interaction/oooh.gif b/resources/images/interaction/oooh.gif new file mode 100644 index 0000000..286533f Binary files /dev/null and b/resources/images/interaction/oooh.gif differ diff --git a/resources/images/interaction/paredes.gif b/resources/images/interaction/paredes.gif new file mode 100644 index 0000000..ecc6fbc Binary files /dev/null and b/resources/images/interaction/paredes.gif differ diff --git a/resources/images/interaction/run.gif b/resources/images/interaction/run.gif new file mode 100644 index 0000000..94a62dd Binary files /dev/null and b/resources/images/interaction/run.gif differ diff --git a/resources/images/interaction/ship.gif b/resources/images/interaction/ship.gif new file mode 100644 index 0000000..c5e56c2 Binary files /dev/null and b/resources/images/interaction/ship.gif differ diff --git a/resources/images/interaction/spank.gif b/resources/images/interaction/spank.gif new file mode 100644 index 0000000..13f2480 Binary files /dev/null and b/resources/images/interaction/spank.gif differ diff --git a/resources/images/logo.png b/resources/images/logo.png new file mode 100644 index 0000000..1740e79 Binary files /dev/null and b/resources/images/logo.png differ diff --git a/resources/images/pype.png b/resources/images/pype.png new file mode 100644 index 0000000..882cd8c Binary files /dev/null and b/resources/images/pype.png differ diff --git a/src/bot.py b/src/bot.py new file mode 100644 index 0000000..1df5147 --- /dev/null +++ b/src/bot.py @@ -0,0 +1,22 @@ +import discord +from settings import BOT_TOKEN +from os import listdir +from utils.logger.pype_logger import PypeLogger + +bot = discord.Bot(intents=discord.Intents.all()) + +def load_cogs(): + for file in listdir("./cogs"): + if(file.endswith(".py")): + try: + bot.load_extension(f"cogs.{file[:-3]}") + PypeLogger.info(f"{file[:-3]} has been loaded") + except Exception as e: + PypeLogger.error(f"Error loading {file[:-3]}",e) + +def main(): + load_cogs() + bot.run(BOT_TOKEN) + +if __name__ == "__main__": + main() diff --git a/src/cogs/admin.py b/src/cogs/admin.py new file mode 100644 index 0000000..c6d629c --- /dev/null +++ b/src/cogs/admin.py @@ -0,0 +1,227 @@ +import discord +from discord.ext import commands +from discord.commands import SlashCommandGroup +from settings import EMBED_COLOR, GUILD_IDS, ADMIN_ROLE_ID, ANNOUNCES_CHANNEL_ID, TIMEZONE +from utils.embeds import crear_embed +from utils.logger.pype_logger import PypeLogger +from utils.files import read_json, write_json +from utils.reactions import añadir_reacciones +from datetime import datetime +import pytz +import json + +class Admin(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + admin = SlashCommandGroup( + name="admin", + description="Comandos de administración", + guild_ids=GUILD_IDS + ) + + @admin.command(name="anuncio", guild_ids=GUILD_IDS, description="Anuncia algo.") + async def anuncio(self, ctx, *, mensaje) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field(name="📢** | Anuncio**", value=mensaje) + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + channel = ctx.guild.get_channel(ANNOUNCES_CHANNEL_ID) + await channel.send(embed=embed) + await ctx.respond(f"Se ha anunciado el mensaje, {ctx.author.mention} ", ephemeral=True) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + # crea un embed con fields, footer, image, thumbnail, author, title, description, color, timestamp a elegir + @admin.command(name="embed", guild_ids=GUILD_IDS, description="Crea un embed.") + async def create_embed(self, ctx: commands.Context, *, + title: str, + description: str, + fields: str = None, + footer_text: str = None, + timestamp: bool = False, + author_name: str = None, + image_url: str = None, + thumbnail_url: str = None, + color: int = None) -> None: + embed = crear_embed(ctx,title,description,fields,footer_text,timestamp,author_name,image_url,thumbnail_url,color) + await ctx.send(embed=embed) + await ctx.respond(f"Se ha creado el embed, {ctx.author.mention} ", ephemeral=True) + + + @admin.command(name='ban', guild_ids=GUILD_IDS, description="Alza el martillo del ban.") + async def ban(self, ctx, *, miembro: discord.Member) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="🚫** | BAN**", value=f"{miembro.mention} ha sido golpead@ por el martillo del Ban.") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(embed=embed) + await miembro.ban() + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name='unban', guild_ids=GUILD_IDS, description="Baja el martillo del ban.") + async def unban(self, ctx, *, miembro: discord.Member) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field(name="🚫** | UNBAN**", + value=f"{miembro.name} se ha recuperado del martillazo.") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(embed=embed) + await miembro.unban() + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name='kick', guild_ids=GUILD_IDS, description="Expulsa a un miembro.") + async def kick(self, ctx, *, miembro: discord.Member, razon: str = "mal comportamiento") -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="🦵🏽** | KICK**", value=f"{miembro.mention} ha sido expulsado por: {razon}.") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(embed=embed) + await miembro.kick(reason=razon) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="mute", guild_ids=GUILD_IDS, description="Silencia a un miembro.") + async def mute(self, ctx, *, miembro: discord.Member) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="🔇** | MUTE**", value=f"{miembro.mention} ha sido silenciad@.") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(embed=embed) + await miembro.edit(mute=True) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="unmute", guild_ids=GUILD_IDS, description="Desilencia a un miembro.") + async def unmute(self, ctx, *, miembro: discord.Member) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="🔊** | UNMUTE**", value=f"{miembro.mention} ha sido desilenciad@.") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(embed=embed) + await miembro.edit(mute=False) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="clearch", guild_ids=GUILD_IDS, description="Borra mensajes.") + async def clear(self, ctx, cantidad: int) -> None: + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(f"Se han limpiado {cantidad} mensajes, {ctx.author.mention}", ephemeral=True) + await ctx.channel.purge(limit=cantidad) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="lock", guild_ids=GUILD_IDS, description="Bloquea un canal.") + async def lock(self, ctx) -> None: + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(f"Se ha bloqueado el canal, {ctx.author.mention}", ephemeral=True) + await ctx.channel.set_permissions(ctx.guild.default_role, send_messages=False) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="unlock", guild_ids=GUILD_IDS, description="Desbloquea un canal.") + async def unlock(self, ctx) -> None: + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(f"Se ha desbloqueado el canal, {ctx.author.mention}", ephemeral=True) + await ctx.channel.set_permissions(ctx.guild.default_role, send_messages=True) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="nick", guild_ids=GUILD_IDS, description="Cambia el apodo de un miembro.") + async def nick(self, ctx, miembro: discord.Member, *, apodo: str) -> None: + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + await ctx.respond(f"Se ha cambiado el apodo de {miembro.mention} a {apodo}, {ctx.author.mention}", ephemeral=True) + await miembro.edit(nick=apodo) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name="role", guild_ids=GUILD_IDS, description="Añade o quita un rol a un miembro.") + async def role(self, ctx, miembro: discord.Member, *, rol: discord.Role) -> None: + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + if rol in miembro.roles: + await ctx.respond(f"Se ha quitado el rol {rol.mention} a {miembro.mention}, {ctx.author.mention}", ephemeral=True) + await miembro.remove_roles(rol) + else: + await ctx.respond(f"Se ha añadido el rol {rol.mention} a {miembro.mention}, {ctx.author.mention}", ephemeral=True) + await miembro.add_roles(rol) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name='votacion', guild_ids=GUILD_IDS, description="Crea una votación.") + async def votacion(self, ctx, *, pregunta, reacciones, tiempo = None) -> None: + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + emojis = "1\uFE0F\u20E3;2\uFE0F\u20E3;3\uFE0F\u20E3;4\uFE0F\u20E3;5\uFE0F\u20E3;6\uFE0F\u20E3;7\uFE0F\u20E3;8\uFE0F\u20E3;9\uFE0F\u20E3" + emojis_list = emojis.split(";") + if tiempo: + embed = discord.Embed(title=pregunta, description=f"Acaba en {tiempo}", color=discord.Color(EMBED_COLOR)) + else: + embed = discord.Embed(title=pregunta, description="", color=discord.Color(EMBED_COLOR)) + reacciones = reacciones.split(",") + a=0 + for r in reacciones: + embed.add_field(name=f"{emojis_list[a]} : {r}", value="", inline=False) + a+=1 + embed.set_author(name=f"Votación 📊", icon_url=ctx.author.avatar.url) + embed.set_footer(text=f"Concord") + embed.timestamp = datetime.now(pytz.timezone(TIMEZONE)) + msg = await ctx.send(embed=embed) + await añadir_reacciones(msg, emojis, len(reacciones)) + await ctx.respond(f"Se ha creado la votación, {ctx.author.mention}", ephemeral=True) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name='warn', guild_ids=GUILD_IDS, description="Añade una advertencia a un miembro.") + async def warn(self, ctx, miembro: discord.Member, *, razon) -> None: + warned_users = read_json("../resources/files/warns.json") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="⚠️** | WARN**", value=f"{miembro.mention} ha sido advertid@ por {razon}.") + + await ctx.respond(embed=embed) + await miembro.send(f"Has sido advertid@ en {ctx.guild.name} por {razon}.") + + key = str(miembro.id) + if key not in warned_users.keys(): + warned_users[key] = 1 + elif key in warned_users.keys(): + warned_users[key]+=1 + + warnsfile = "../resources/files/warns.json" + + write_json(warnsfile, warned_users) + + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name='warns', guild_ids=GUILD_IDS, description="Muestra las advertencias de un miembro.") + async def warns(self, ctx, miembro: discord.Member) -> None: + warned_users = read_json("../resources/files/warns.json") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="⚠️** | WARN**", value=f"{miembro.mention} tiene {warned_users[str(miembro.id)]} advertencias.") + await ctx.respond(embed=embed, ephemeral=True) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + + @admin.command(name='clearwarns', guild_ids=GUILD_IDS, description="Elimina las advertencias de un miembro.") + async def clearwarns(self, ctx, miembro: discord.Member) -> None: + warned_users = read_json("../resources/files/warns.json") + if ctx.author.guild.get_role(ADMIN_ROLE_ID) in ctx.author.roles: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field( + name="⚠️** | WARN**", value=f"{miembro.mention} ha sido desadvertid@.") + + await ctx.respond(embed=embed, ephemeral=True) + + warned_users[str(miembro.id)] = 0 + warnsfile = "../resources/files/warns.json" + + write_json(warnsfile, warned_users) + else: + await ctx.respond(f"No tienes permisos para eso, {ctx.author.mention} ", ephemeral=True) + +def setup(bot) -> None: + bot.add_cog(Admin(bot)) diff --git a/src/cogs/events.py b/src/cogs/events.py new file mode 100644 index 0000000..9cf9eab --- /dev/null +++ b/src/cogs/events.py @@ -0,0 +1,83 @@ +import discord +from discord.ext import commands +from settings import ( + EMBED_COLOR, BOT_NAME, ADMIN_CHANNEL_ID, BOT_LOGO, COUNTER_CHANNEL_ID, + WELCOME_CHANNEL_ID, UNVERIFIED_ROLE_ID, VERIFIED_ROLE_ID +) +from utils.logger.pype_logger import PypeLogger +import asyncio +from utils.bot import bot_status_randomizer +from utils.files import read, write + +class Events(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + @commands.Cog.listener() + async def on_ready(self): + PypeLogger.success(f"Logged in as {self.bot.user.name}#{self.bot.user.discriminator}") + channel = self.bot.get_channel(ADMIN_CHANNEL_ID) + embed = discord.Embed(title = f"{BOT_NAME} Console", + description = "```✅ | Logged in as Pype#6125\n🐍 | Estoy listo pa\n🐍 | >>>```", + color=discord.Color(EMBED_COLOR)) + await channel.send(embed=embed) + await self.bot.user.edit(avatar=open("../"+BOT_LOGO, "rb").read()) + while True: + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, + name=bot_status_randomizer("../resources/files/shows.txt"))) + await asyncio.sleep(60) + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, + name=bot_status_randomizer("../resources/files/juegos.txt"))) + await asyncio.sleep(60) + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, + name=bot_status_randomizer("../resources/files/grupos.txt"))) + await asyncio.sleep(60) + + @commands.Cog.listener() + async def on_message(self, message: discord.Message): + if message.author != self.bot.user: + if message.channel.id == COUNTER_CHANNEL_ID: + if message.author != self._last_member: + try: + # Evaluar el contenido del mensaje como una expresión matemática + numero = int(eval(message.content)) + file = "../resources/files/counter.csv" + n = int(read(file)) + + if numero == n + 1: + await message.add_reaction("✅") + self._last_member = message.author + n += 1 + write(file, str(n)) + else: + await message.add_reaction("❌") + await message.channel.send(f"{message.author.mention} falló, reseteando el contador.") + write(file, "0") + except (ValueError, SyntaxError): + await message.delete() + else: + await message.delete() + + + @commands.Cog.listener() + async def on_member_join(self, member): + bienvenidas = self.bot.get_channel(WELCOME_CHANNEL_ID) + """defaultrole = member.guild.get_role(UNVERIFIED_ROLE_ID) + verifiedrole = member.guild.get_role(VERIFIED_ROLE_ID) + if member.guild.get_role(VERIFIED_ROLE_ID) in member.roles: + await member.remove_roles(verifiedrole) + await member.add_roles(defaultrole)""" + await bienvenidas.send(f"¡Bienvenido {member.mention}! Espero que te lo pases bien en el servidor. Recuerda leer las <#1092518793143652352> para evitar ser sancionado. ¡Diviértete! :D") + + @commands.Cog.listener() + async def on_member_leave(self, after): + adminchannel = self.bot.get_channel(ADMIN_CHANNEL_ID) + await adminchannel.send(f"**{after.name}** ha abandonado el servidor") + + @commands.Cog.listener() + async def on_application_command(self, ctx): + PypeLogger.command(f"{ctx.author} ha ejecutado el comando {ctx.command} en {ctx.guild.name}.") + +def setup(bot): + bot.add_cog(Events(bot)) \ No newline at end of file diff --git a/src/cogs/help.py b/src/cogs/help.py new file mode 100644 index 0000000..98f0e7d --- /dev/null +++ b/src/cogs/help.py @@ -0,0 +1,71 @@ +import discord +from discord.ext import commands, pages +from discord.commands import SlashCommandGroup +from settings import ( + EMBED_COLOR, GUILD_IDS, INDICE, VARIOS, + INTERACCION, INTERACCION_2, NSFW, MATEMATICAS, MUSICA, VERIFICACION, HELP +) + +class Help(commands.Cog): + def __init__(self, bot): + self.bot = bot + + help = SlashCommandGroup("help", "Comandos de Ayuda", guild_ids=GUILD_IDS) + + @help.command(name="all", guild_ids=GUILD_IDS, description="Abre el menú de ayuda de comandos.") + async def all(self, ctx: discord.ApplicationContext): + indice_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + indice_embed.add_field(name="**📝 | Categorías**", value=INDICE) + + varios_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + varios_embed.add_field(name="**🪶 | Varios**", value=VARIOS) + + interaccion_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + interaccion_embed.add_field( + name="**👥 | Interacción**", value=INTERACCION, inline=False) + interaccion_embed.add_field( + name="**👥 | Interacción**", value=INTERACCION_2, inline=False) + + nsfw_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + nsfw_embed.add_field(name="**🔞 | NSFW**", value=NSFW) + + matematicas_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + matematicas_embed.add_field( + name="**🧮 | Matemáticas**", value=MATEMATICAS) + + musica_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + musica_embed.add_field(name="**🎶 | Música**", value=MUSICA) + + verificacion_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + verificacion_embed.add_field( + name="**✅ | Verificación**", value=VERIFICACION) + + help_embed = discord.Embed( + title="**📖 | MENÚ DE COMANDOS**", color=discord.Color(EMBED_COLOR)) + help_embed.add_field(name="**🆘 | Ayuda**", value=HELP) + + paginator = pages.Paginator( + pages=[ + indice_embed, + varios_embed, + interaccion_embed, + nsfw_embed, + matematicas_embed, + musica_embed, + verificacion_embed, + help_embed + ], + loop_pages=True + ) + await paginator.respond(ctx.interaction, ephemeral=False) + + +def setup(bot): + bot.add_cog(Help(bot)) \ No newline at end of file diff --git a/src/cogs/interaction.py b/src/cogs/interaction.py new file mode 100644 index 0000000..67d72fd --- /dev/null +++ b/src/cogs/interaction.py @@ -0,0 +1,207 @@ +import discord +from discord.ext import commands +from discord.commands import SlashCommandGroup +import hmtai +import random +import json +from settings import GUILD_IDS, EMBED_COLOR +from utils.files import read_json + +class Interaccion(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + inter = SlashCommandGroup("inter", "Comandos de Interacción", guild_ids=GUILD_IDS) + + @inter.command(name='wave', guild_ids=GUILD_IDS, description="Saluda a alguien.") + async def wave(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} saludó a {miembro.mention}.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "wave")) + await ctx.respond(embed=embed) + + @inter.command(name='dance', guild_ids=GUILD_IDS, description="Saca los pasos prohibidos.") + async def dance(self, ctx): + embed = discord.Embed( + description=f"{ctx.author.mention} se puso a bailar.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "dance")) + await ctx.respond(embed=embed) + + @inter.command(name='nice', guild_ids=GUILD_IDS, description="Di que te gusta.") + async def nice(self, ctx): + embed = discord.Embed( + description=f"A {ctx.author.mention} le gustó eso.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "like")) + await ctx.respond(embed=embed) + + @inter.command(name='nosebleed', guild_ids=GUILD_IDS, description="OwO") + async def nosebleed(self, ctx): + embed = discord.Embed( + description=f"{ctx.author.mention} empezó a sangrar por la nariz.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "nosebleed")) + await ctx.respond(embed=embed) + + @inter.command(name='punch', guild_ids=GUILD_IDS, description="ONE PUUUUUUUNCH.") + async def punch(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} le dio un puñetazo a {miembro.mention}.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "punch")) + await ctx.respond(embed=embed) + + @inter.command(name='feed', guild_ids=GUILD_IDS, description="Ñam ñam.") + async def feed(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} le dio de comer a {miembro.mention}.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "feed")) + await ctx.respond(embed=embed) + + @inter.command(name='tickle', guild_ids=GUILD_IDS, description="Tortura de la risa.") + async def tickle(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} le hizo cosquillas a {miembro.mention}.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "tickle")) + await ctx.respond(embed=embed) + + @inter.command(name='bite', guild_ids=GUILD_IDS, description="Muerde a alguien.") + async def bite(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} le dio un mordisco a {miembro.mention}.", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "bite")) + await ctx.respond(embed=embed) + + @inter.command(name='hug', guild_ids=GUILD_IDS, description="Abraza a alguien.") + async def hug(self, ctx, *, miembro: discord.Member): + hugdata = read_json("../resources/files/hugs.json") + key = str(miembro.id) + if key not in hugdata.keys(): + hugdata[key] = 1 + elif key in hugdata.keys(): + hugdata[key]+=1 + with open("/home/container/data/hugs.json", 'w', encoding='utf8') as outfile: + str_ = json.dumps(hugdata, indent=4, sort_keys=True, separators=(',', ': '), ensure_ascii=False) + outfile.write(str_) + + nabrazos = hugdata[str(miembro.id)] + + embed = discord.Embed( + description=f"{ctx.author.mention} le dio un abrazo a {miembro.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "hug")) + embed.set_footer(text=f"{miembro.name} ha sido abrazado {nabrazos} veces.") + await ctx.respond(embed=embed) + + @inter.command(name='kill', guild_ids=GUILD_IDS, description="Arrebátale la vida a alguien.") + async def kill(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} asesinó a {miembro.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "kill")) + await ctx.respond(embed=embed) + + @inter.command(name='kiss', guild_ids=GUILD_IDS, description="Cómele la boca a alguien.") + async def kiss(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} le dio un beso a {miembro.mention} >.<", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "kiss")) + await ctx.respond(embed=embed) + + @inter.command(name='pat', guild_ids=GUILD_IDS, description="Acaricia a alguien.") + async def pat(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} acarició a {miembro.mention} UwU", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "pat")) + await ctx.respond(embed=embed) + + @inter.command(name='slap', guild_ids=GUILD_IDS, description="Abofetea a alguien.") + async def slap(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} le dio una bofetada a {miembro.mention} >:)", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "slap")) + await ctx.respond(embed=embed) + + @inter.command(name='sleep', guild_ids=GUILD_IDS, description="A mimir.") + async def sleep(self, ctx): + embed = discord.Embed( + description=f"{ctx.author.mention} se fue a mimir", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "sleep")) + await ctx.respond(embed=embed) + + @inter.command(name='cry', guild_ids=GUILD_IDS, description="Expresa tu tristeza...") + async def cry(self, ctx): + embed = discord.Embed( + description=f"{ctx.author.mention} se puso triste :(", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "cry")) + await ctx.respond(embed=embed) + + @inter.command(name='cuddle', guild_ids=GUILD_IDS, description="Acurrúcate con alguien.") + async def cuddle(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} se acurrucó con {miembro.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "cuddle")) + await ctx.respond(embed=embed) + + @inter.command(name='lick', guild_ids=GUILD_IDS, description="Lámele a alguien. 7u7") + async def lick(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} lamió sensualmente a {miembro.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "lick")) + await ctx.respond(embed=embed) + + @inter.command(name='threaten', guild_ids=GUILD_IDS, description="Amenaza a alguien.") + async def threaten(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} amenazó con cortarle la picha a {miembro.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "threaten")) + await ctx.respond(embed=embed) + + @inter.command(name='femboy', guild_ids=GUILD_IDS, description="Femboiza a alguien.") + async def femboy(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} ha convertido en femboy a {miembro.mention}", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/femboy.png", filename="imagen.png") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file,embed=embed) + + # ----------------| ESPECÍFICAS |------------------------------------------------------------------------------------------------------------------- + + @inter.command(name='run', guild_ids=GUILD_IDS, description="Huye!!!") + async def run(self, ctx): # type: ignore + embed = discord.Embed( + description=f"{ctx.author.mention} se puso a correr", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/run.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @inter.command(name='fbi', guild_ids=GUILD_IDS, description="Llama al FBI.") + async def run(self, ctx, *, miembro: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} ha llamado al FBI. Corre {miembro.mention}!", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/fbi.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @inter.command(name='spank', guild_ids=GUILD_IDS, description="Reparte nalgadas como panes.") + async def spank(self, ctx, *, alguien: discord.Member): + embed = discord.Embed( + description=f"{ctx.author.mention} nalgueó a {alguien.mention} >///<", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/spank.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @inter.command(name='ship', guild_ids=GUILD_IDS, description="Shipea a dos personas (porcentaje de compatibilidad).") + async def ship(self, ctx, *, persona1: discord.Member, persona2: discord.Member): + embed = discord.Embed( + description=f"{persona1.mention} x {persona2.mention}\n ❤️ La compatibilidad es del: **{random.randint(0, 100)}%**", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/ship.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @inter.command(name='moan', guild_ids=GUILD_IDS, description="Gime como una perra.") + async def moan(self, ctx): + embed = discord.Embed( + description=f"{ctx.author.mention} gimió como una perra.", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/moan.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + +def setup(bot): + bot.add_cog(Interaccion(bot)) \ No newline at end of file diff --git a/src/cogs/math.py b/src/cogs/math.py new file mode 100644 index 0000000..29b38de --- /dev/null +++ b/src/cogs/math.py @@ -0,0 +1,143 @@ +import time +import discord +import matplotlib.pyplot as plt +import numpy as np +from discord.ext import commands +from discord.commands import SlashCommandGroup +from matplotlib.patches import Circle +from settings import EMBED_COLOR, GUILD_IDS +from utils.bot import esPar, esPrimo + +class Math(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + mates = SlashCommandGroup("mates", "Comandos de Matemáticas", guild_ids=GUILD_IDS) + + @mates.command(name='contar', guild_ids=GUILD_IDS, description="Cuenta desde a hasta b.") + async def contar(self, ctx, a: int, b: int): + await ctx.respond(f"*Contando desde {a} hasta {b}...*", ephemeral=True) + i = a + time.sleep(1) + await ctx.send(a) + time.sleep(1) + for i in range(a, b): + await ctx.send(str(i+1)) + time.sleep(1) + + @mates.command(name="calc", guild_ids=GUILD_IDS, description="Resuelve una expresión matemática.") + async def calc(self, ctx, *, expresion): + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field(name="**Resultado**", + value=f"{expresion} = " + str(eval(expresion))) + await ctx.respond(embed=embed) + + @mates.command(name="par", guild_ids=GUILD_IDS, description="Dice si un número es par o no.") + async def par(self, ctx, numero: int): + numres = esPar(numero) + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field(name="**Resultado**", value=numres) + await ctx.respond(embed=embed) + + @mates.command(name="primo", guild_ids=GUILD_IDS, description="Dice si un número es primo o no.") + async def primo(self, ctx, numero: int): + numres = esPrimo(numero) + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field(name="**Resultado**", value=numres) + await ctx.respond(embed=embed) + + @mates.command(name='grafseno', guild_ids=GUILD_IDS, description="Grafica una función seno (a, k).") + async def grafseno(self, ctx, a: int, k: int): + x = np.linspace(0, 2*np.pi, 400) + y = a * np.sin(k*x) + plt.axhline(0, color="black") + plt.plot(x, y, color="#b2122f") + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + + @mates.command(name='grafcoseno', guild_ids=GUILD_IDS, description="Grafica una función coseno (a, k).") + async def grafcoseno(self, ctx, a: int, k: int): + x = np.linspace(0, 2*np.pi, 400) + y = a * np.cos(k*x) + plt.axhline(0, color="black") + plt.plot(x, y, color="#b2122f") + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + + @mates.command(name='grafrecta', guild_ids=GUILD_IDS, description="Grafica una función lineal (m, n).") + async def grafrecta(self, ctx, m: int, n: int): + def f(x): + return m*x+n + x = range(-10000, 10000) + y = [f(i) for i in x] + plt.axhline(0, color="black") + plt.axvline(0, color="black") + plt.xlim(-10, 10) + plt.ylim(-20, 20) + plt.plot(x, y, color="#b2122f") + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + + @mates.command(name='grafparabola', guild_ids=GUILD_IDS, description="Grafica una parábola (a, b, c).") + async def grafparabola(self, ctx, a: int, b: int, c: int): + def f(x): + return a*(x*x)+b*x+c + x = np.linspace(-10, 10, 1000) + y = [f(i) for i in x] + plt.axhline(0, color="black") + plt.axvline(0, color="black") + plt.xlim(-10, 10) + plt.ylim(-20, 20) + plt.plot(x, y, color="#b2122f") + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + + @mates.command(name='grafcircunferencia', guild_ids=GUILD_IDS, description="Grafica una circunferencia (r).") + async def grafcircunferencia(self, ctx, r: int): + fig, ax = plt.subplots() + ax.set_aspect('equal') + circle1 = Circle((0, 0), r, color='r') + ax.add_artist(circle1) + plt.xlim(-10, 10) + plt.ylim(-10, 10) + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + + @mates.command(name='graflog', guild_ids=GUILD_IDS, description="Grafica una función logarítmica (a, b).") + async def graflog(self, ctx, a: int, b: int): + def f(x): + return a*np.log(x)+b + x = np.linspace(-10, 10, 1000) + y = [f(i) for i in x] + plt.axhline(0, color="black") + plt.axvline(0, color="black") + plt.xlim(-10, 10) + plt.ylim(-20, 20) + plt.plot(x, y, color="#b2122f") + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + + @mates.command(name='grafexp', guild_ids=GUILD_IDS, description="Grafica una función exponencial (a, b).") + async def grafexp(self, ctx, a: int, b: int): + def f(x): + return a*np.exp(b*x) + x = np.linspace(-10, 10, 1000) + y = [f(i) for i in x] + plt.axhline(0, color="black") + plt.axvline(0, color="black") + plt.xlim(-10, 10) + plt.ylim(-20, 20) + plt.plot(x, y, color="#b2122f") + plt.savefig("../resources/images/graphics/graf.png") + await ctx.respond(file=discord.File("../resources/images/graphics/graf.png")) + plt.clf() + +def setup(bot): + bot.add_cog(Math(bot)) \ No newline at end of file diff --git a/src/cogs/misc.py b/src/cogs/misc.py new file mode 100644 index 0000000..9189e67 --- /dev/null +++ b/src/cogs/misc.py @@ -0,0 +1,146 @@ +import discord +from discord.ext import commands +from discord.commands import SlashCommandGroup +from settings import EMBED_COLOR, BOT_NAME, VERSION, OWNER_ID, DISCORD_LOGO, BOT_LOGO, GUILD_IDS +from datetime import datetime +from random import randint, choice +import hmtai + +class Misc(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + misc = SlashCommandGroup( + name="misc", + description="Comandos varios", + guild_ids=GUILD_IDS + ) + + @misc.command(name="ping", guild_ids=GUILD_IDS, description="Muestra la latencia del bot.") + async def ping(self, ctx) -> None: + await ctx.respond(f'Pong! Latency is {round(float(self.bot.latency * 1000), 2)}') + + @misc.command(name="info", guild_ids=GUILD_IDS, description="Muestra información sobre el servidor.") + async def info(self, ctx) -> None: + embed1 = discord.Embed(title=f"{ctx.guild.name}", description="Información del servidor", + timestamp=datetime.now(), color=discord.Color(EMBED_COLOR)) + embed1.add_field(name="Miembros: ", value=f"{ctx.guild.member_count}") + embed1.add_field(name="Creador: ", value=f"{ctx.guild.owner}") + embed1.add_field(name="Nº comandos", value=f"{len(self.bot.commands)}") + mclogo = discord.File("../"+DISCORD_LOGO, filename="image.png") + embed1.set_footer(icon_url="attachment://image.png", + text=f"pedido por {ctx.author.name}") + embed1.set_thumbnail(url="attachment://image.png") + + embed2 = discord.Embed( + title=f"Nuestro bot {BOT_NAME}", color=discord.Color(EMBED_COLOR)) + embed2.add_field(name="Lenguaje", value=f"Python", inline=False) + embed2.add_field(name="Tipo", value=f"Multipropósito", inline=False) + embed2.add_field(name="Versión", value=str(VERSION), inline=False) + pypeav = discord.File("../"+BOT_LOGO, filename="image.png") + embed2.set_image(url="attachment://image.png") + + await ctx.respond(file=mclogo, embed=embed1) + await ctx.respond(file=pypeav, embed=embed2) + + @misc.command(name='say', guild_ids=GUILD_IDS, description="Manda un mensaje a través del bot.") + async def say(self, ctx, *, algo) -> None: + await ctx.respond("Mensaje enviado :)", ephemeral=True) + await ctx.send(algo) + + @misc.command(name='platano', guild_ids=GUILD_IDS, description="Conoce la medida de tu plátano.") + async def platano(self, ctx) -> None: + if ctx.author.id == OWNER_ID: + banana = 21 + else: + banana = randint(-5, 21) + embed = discord.Embed( + title=f"El plátano de **{ctx.author}** mide {banana} cm 😳", color=discord.Color(EMBED_COLOR)) + embed.set_image( + url="https://cdn.discordapp.com/attachments/755529601333067940/853072892702490624/banana.png") + await ctx.respond(embed=embed) + + @misc.command(name='dado', guild_ids=GUILD_IDS, description="Tira un dado de 6 caras.") + async def dado(self, ctx) -> None: + res = randint(1, 6) + embed = discord.Embed(title="🎲 Se ha lanzado un dado", + color=discord.Color(EMBED_COLOR)) + embed.add_field(name="Resultado: ", value=str(res)) + await ctx.respond(embed=embed) + + @misc.command(name='moneda', guild_ids=GUILD_IDS, description="Tira una moneda al aire.") + async def moneda(self, ctx) -> None: + coinResults = ("Cara 😀", "Cruz ❌") + res = choice(coinResults) + embed = discord.Embed(title="🪙 Se ha lanzado la moneda", + color=discord.Color(EMBED_COLOR)) + embed.add_field(name="Resultado: ", value=res) + await ctx.respond(embed=embed) + + @misc.command(name='avatar', guild_ids=GUILD_IDS, description="Renderiza el avatar de alguien.") + async def avatar(self, ctx, *, miembro: discord.Member) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + embed.add_field(name='Avatar de:', value=miembro.mention) + if miembro.avatar: + pfp = miembro.avatar.with_size(1024) + embed.set_image(url=pfp) + else: + embed.add_field(name='No hay avatar', value='Este usuario no tiene un avatar personalizado.') + await ctx.respond(embed=embed) + + @misc.command(name='wallpaper', guild_ids=GUILD_IDS, description="Wallpaper de anime para pc.") + async def wallpaper(self, ctx) -> None: + embed = discord.Embed( + description=f"Aquí tienes tu wallpaper, {ctx.author.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "wallpaper")) + await ctx.respond(embed=embed) + + @misc.command(name='mobilewallpaper', guild_ids=GUILD_IDS, description="Genera un wallpaper para tu móvil.") + async def mobileWallpaper(self, ctx) -> None: + embed = discord.Embed( + description=f"Aquí tienes tu wallpaper {ctx.author.mention}", color=discord.Color(EMBED_COLOR)) + embed.set_image(url=hmtai.get("hmtai", "mobileWallpaper")) + await ctx.respond(embed=embed) + + @misc.command(name='paredes', guild_ids=GUILD_IDS, description="Están por las paredes.") + async def paredes(self, ctx, *, miembro: discord.Member) -> None: + embed = discord.Embed( + description=f"{miembro.mention} está por las paredes!", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/paredes.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @misc.command(name='oooh', guild_ids=GUILD_IDS, description="Ooohh.") + async def oooh(self, ctx) -> None: + embed = discord.Embed(color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/oooh.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @misc.command(name='carey', guild_ids=GUILD_IDS, description="Feliz navidad.") + async def carey(self, ctx) -> None: + file = discord.File("../resources/images/interaction/dale al play.webm") + await ctx.respond(file=file) + + @misc.command(name='beber', guild_ids=GUILD_IDS, description="Bebe alcohol.") + async def beber(self, ctx) -> None: + # lista de bebidas alcohólicas + bebidas = ["cerveza", "vino", "whisky", "ron", "vodka", "tequila", "ginebra", "sidra", "champán", "cava", "sake", "absenta", "brandy", "licor", "vermut", "mezcal", "pacharán", "anís", "aguardiente", "coñac", "cóctel", "cubata", "cóctel", "cubalibre"] + bebida = choice(bebidas) + embed = discord.Embed( + description=f"{ctx.author.mention} ha bebido {bebida}", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/beber.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + + @misc.command(name="bombardeen", guild_ids=GUILD_IDS, description="Bombardea a alguien/algo.") + async def bombardeen(self, ctx, *, objetivo) -> None: + embed = discord.Embed( + description=f"Bombardeen {objetivo}", color=discord.Color(EMBED_COLOR)) + file = discord.File("../resources/images/interaction/bombardeen.gif", filename="imagen.gif") + embed.set_image(url="attachment://imagen.gif") + await ctx.respond(file=file, embed=embed) + +def setup(bot): + bot.add_cog(Misc(bot)) \ No newline at end of file diff --git a/src/cogs/music.py b/src/cogs/music.py new file mode 100644 index 0000000..fd10cb3 --- /dev/null +++ b/src/cogs/music.py @@ -0,0 +1,168 @@ +import discord +import wavelink +from discord.ext import commands +from discord.commands import SlashCommandGroup +import wavelink +from settings import ( + EMBED_COLOR, GUILD_IDS, WAVELINK_URI, WAVELINK_PASSWORD, GUILD_NAME +) +from utils.logger.pype_logger import PypeLogger + +class Music(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + musica = SlashCommandGroup("musica", "Comandos de música", guild_ids=GUILD_IDS) + + async def setup_hook(self) -> None: + # Wavelink 2.0 has made connecting Nodes easier... Simply create each Node + # and pass it to NodePool.connect with the client/bot. + node: wavelink.Node = wavelink.Node(uri=WAVELINK_URI, password=WAVELINK_PASSWORD, secure=False) + await wavelink.NodePool.connect(client=self.bot, nodes=[node]) + PypeLogger.success(f"Se ha conectado a -> {node}") + + @commands.Cog.listener() + async def on_ready(self): + await self.setup_hook() + + @commands.Cog.listener() + async def on_wavelink_track_start(self, track: wavelink.TrackEventPayload): + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=track.track.title)) + + @commands.Cog.listener() + async def on_wavelink_track_end(self, track: wavelink.TrackEventPayload): + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name=GUILD_NAME)) + + @musica.command(name="play", guild_ids=GUILD_IDS, description="Reproduce una canción") + async def play(self, ctx: commands.Context, *, cancion: str, sitio: str = "youtube") -> None: + if not ctx.voice_client: + vc: wavelink.Player = await ctx.author.voice.channel.connect(cls=wavelink.Player) + else: + vc: wavelink.Player = ctx.voice_client + if sitio == "spotify": + #decoded = spotify.decode_url(cancion) + #if not decoded or decoded['type'] is not spotify.SpotifySearchType.track: + # await ctx.send('Sólo se permiten urls de Spotify.') + # return + #track = await spotify.SpotifyTrack.search(cancion) + ctx.respond("Próximamente") + elif sitio == "youtube": + track = await wavelink.YouTubeTrack.search(cancion, return_first=True) + if not vc.is_playing(): + await vc.play(track) + try: + await self.bot.user.edit(avatar=open("../resources/images/djpype.png", "rb").read()) + except: + pass + embed = discord.Embed(title="▶️ Reproduciendo", description=track.title + " de " + track.author + " en " + sitio, color=EMBED_COLOR) + elif vc.is_playing(): + cola: wavelink.BaseQueue = vc.auto_queue + vc.autoplay = True + await cola.put_wait(track) + embed = discord.Embed(title="🎶 Añadido a la cola", description=track.title + " de " + track.author + " en " + sitio, color=EMBED_COLOR) + if cola.is_empty: + embed = discord.Embed(title="▶️ Reproduciendo", description="La cola está vacía.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="pause", guild_ids=GUILD_IDS, description="Pausa la canción") + async def pausa(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + if vc.is_playing(): + if vc.is_paused(): + embed = discord.Embed(title="⏸️ Pausado", description="La canción ya está pausada.", color=EMBED_COLOR) + await vc.pause() + embed = discord.Embed(title="⏸️ Pausado", description="La canción ha sido pausada.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="resume", guild_ids=GUILD_IDS, description="Reanuda la canción") + async def reanudar(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + await vc.resume() + embed = discord.Embed(title="▶️ Reproduciendo", description="La canción ha sido reanudada.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="stop", guild_ids=GUILD_IDS, description="Detiene la canción") + async def parar(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + await vc.stop() + embed = discord.Embed(title="⏹️ Detenido", description="La canción ha sido detenida.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="join", guild_ids=GUILD_IDS, description="Conecta al bot al canal de voz") + async def conectar(self, ctx: commands.Context) -> None: + if not ctx.voice_client: + await ctx.author.voice.channel.connect(cls=wavelink.Player) + else: + ctx.voice_client + embed = discord.Embed(title="🔊 Conectado", description="Me he conectado al canal de voz.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="leave", guild_ids=GUILD_IDS, description="Desconecta al bot del canal de voz") + async def desconectar(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + await vc.disconnect() + await self.bot.user.edit(avatar=open("../resources/images/pype.png", "rb").read()) + await self.bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="Concord")) + embed = discord.Embed(title="🔊 Desconectado", description="Me he desconectado del canal de voz.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command() + async def ahora(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + track: wavelink.Track = vc.current + embed = discord.Embed(title="🎶 Canción actual", description=track.title + " de " + track.author, color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="volume", guild_ids=GUILD_IDS, description="Cambia el volumen del bot") + async def volumen(self, ctx: commands.Context, volumen: int) -> None: + vc: wavelink.Player = ctx.voice_client + if volumen < 100: + await vc.set_volume(volumen) + embed = discord.Embed(title="🔊 Volumen", description="El volumen ha sido cambiado a " + str(volumen), color=EMBED_COLOR) + else: + embed = discord.Embed(title="🔊 Volumen", description="El volumen no puede ser mayor a 100.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="loop", guild_ids=GUILD_IDS, description="Repite la canción o la cola") + async def bucle(self, ctx: commands.Context, *, bucle = "current") -> None: + vc: wavelink.Player = ctx.voice_client + if bucle == "current": + vc.queue.loop = True + embed = discord.Embed(title="🔁 Repetir", description="La canción se repetirá indefinidamente.", color=EMBED_COLOR) + elif bucle == "all": + vc.queue.loop_all = True + embed = discord.Embed(title="🔁 Repetir", description="La cola se repetirá indefinidamente.", color=EMBED_COLOR) + elif bucle == "off": + vc.queue.loop = False + vc.queue.loop_all = False + embed = discord.Embed(title="🔁 Repetir", description="La repetición ha sido desactivada.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="seek", guild_ids=GUILD_IDS, description="Avanza la canción x segundos") + async def avanzar(self, ctx: commands.Context, segundos: int) -> None: + vc: wavelink.Player = ctx.voice_client + await vc.seek(segundos*1000) + embed = discord.Embed(title="⏩ Avanzar", description="Se han adelantado " + str(segundos) + "s.", color=EMBED_COLOR) + await ctx.respond(embed=embed) + + @musica.command(name="queue", guild_ids=GUILD_IDS, description="Muestra la cola de canciones") + async def cola(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + cola = vc.auto_queue + embed = discord.Embed(title="🎶 Cola", description="", color=EMBED_COLOR) + i = 1 + for track in cola._queue: + embed.add_field(name=f"Canción nº{i}", value=f"{track.title} de {track.author}", inline = False) + i+=1 + await ctx.respond(embed=embed) + + @musica.command(name="skip", guild_ids=GUILD_IDS, description="Salta a la siguiente canción") + async def saltar(self, ctx: commands.Context) -> None: + vc: wavelink.Player = ctx.voice_client + await vc.play(vc.auto_queue.get()) + embed = discord.Embed(title="⏭️ Saltar", description=f"Se ha saltado a la siguiente canción", color=EMBED_COLOR) + await ctx.respond(embed=embed) + +def setup(bot): + bot.add_cog(Music(bot)) \ No newline at end of file diff --git a/src/cogs/nsfw.py b/src/cogs/nsfw.py new file mode 100644 index 0000000..73f69d6 --- /dev/null +++ b/src/cogs/nsfw.py @@ -0,0 +1,153 @@ +import discord +from discord.ext import commands +from discord.commands import SlashCommandGroup +import hmtai +from settings import GUILD_IDS + +class InteraccionNSFW(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + nsfw = SlashCommandGroup("nsfw", "Comandos NSFW", guild_ids=GUILD_IDS) + + @nsfw.command(name='creampie', guild_ids=GUILD_IDS, description="Lechita.") + async def creampie(self, ctx, *, miembro: discord.Member = None): + if ctx.channel.is_nsfw(): + if miembro: + embed = discord.Embed(description=f"{ctx.author.mention} se vino en {miembro.mention} 😳", color=discord.Color.from_rgb(177,18,46)) + else: + embed = discord.Embed(description=f"{ctx.author.mention} se vino 😳", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","creampie")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='hentai', guild_ids=GUILD_IDS, description="Go to horny jail.") + async def hentai(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description="Disfruta 😳", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","classic")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='anal', guild_ids=GUILD_IDS, description="Es la hora de dar por culo.") + async def anal(self, ctx, *, miembro: discord.Member): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"{ctx.author.mention}: * le da por culo *\n {miembro.mention}: Man dao por culo Dios mío! Hola.", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","anal")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral = True) + + @nsfw.command(name='ass', guild_ids=GUILD_IDS, description="Culito, culito!") + async def ass(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"{ctx.author.mention} toma culo!", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","ass")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral = True) + + @nsfw.command(name='bdsm', guild_ids=GUILD_IDS, description="Atar?") + async def bdsm(self, ctx,*,miembro: discord.Member = None): + if ctx.channel.is_nsfw(): + if miembro: + embed = discord.Embed(description=f"{ctx.author.mention} le practicó el BDSM a {miembro.mention} 😳", color=discord.Color.from_rgb(177,18,46)) + else: + embed = discord.Embed(description=f"A {ctx.author.mention} le gusta el BDSM!", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","bdsm")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='doujin', guild_ids=GUILD_IDS, description="Página random de un doujinshi.") + async def doujin(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"Aquí tienes tu página random de un doujin, {ctx.author.mention}.", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","manga")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='fap', guild_ids=GUILD_IDS, description="Fap fap fap fap.") + async def fap(self, ctx, *, miembro: discord.Member = None): + if ctx.channel.is_nsfw(): + if miembro: + embed = discord.Embed(description=f"{ctx.author.mention} hizo sentir rico a {miembro.mention} 😳", color=discord.Color.from_rgb(177,18,46)) + else: + embed = discord.Embed(description=f"{ctx.author.mention} se tocó 😳", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","handjob")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='ero', guild_ids=GUILD_IDS, description="Fucking pervert.") + async def ero(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"Aquí tienes tu contenido ero, {ctx.author.mention}.", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","ero")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='yuri', guild_ids=GUILD_IDS, description="Imagen yuri 🏳️‍🌈.") + async def yuri(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"Aquí tienes tu contenido yuri, {ctx.author.mention}.", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","yuri")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='blowjob', guild_ids=GUILD_IDS, description="* clk clk clk *") + async def blowjob(self, ctx, *, miembro: discord.Member = None): + if ctx.channel.is_nsfw(): + if miembro: + embed = discord.Embed(description=f"{ctx.author.mention} * clk clk clk * {miembro.mention} 😳", color=discord.Color.from_rgb(177,18,46)) + else: + embed = discord.Embed(description=f"{ctx.author.mention} realizó la AutoM", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","blowjob")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='boobs', guild_ids=GUILD_IDS, description="tetas tetitas tetazas tetotas tetarracas.") + async def boobs(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"Aquí tienes tus tetas tetarracas, {ctx.author.mention}.", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","boobs")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='pussy', guild_ids=GUILD_IDS, description="Es temporada de recogida de higos.") + async def pussy(self, ctx): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"{ctx.author.mention} recogió un higo.", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","pussy")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='boobjob', guild_ids=GUILD_IDS, description="Tetas tetarracas + * clk clk clk *") + async def boobjob(self, ctx,*,miembro: discord.Member): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"{ctx.author.mention} le hizo una boobjob a {miembro.mention}", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","boobjob")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + + @nsfw.command(name='gangbang', guild_ids=GUILD_IDS, description="Muchas tuneladoras para un sólo túnel.") + async def gangbang(self, ctx, *, abusador_1: discord.Member, abusador_2: discord.Member, abusador_3: discord.Member, victima: discord.Member): + if ctx.channel.is_nsfw(): + embed = discord.Embed(description=f"{ctx.author.mention} & {abusador_1.mention},{abusador_2.mention},{abusador_3.mention} taladraron a {victima.mention} 😳", color=discord.Color.from_rgb(177,18,46)) + embed.set_image(url=hmtai.get("hmtai","gangbang")) + await ctx.respond(embed=embed) + else: + await ctx.respond("*Debes usar el comando en un canal NSFW...*", ephemeral=True) + +def setup(bot): + bot.add_cog(InteraccionNSFW(bot)) \ No newline at end of file diff --git a/src/cogs/verification.py b/src/cogs/verification.py new file mode 100644 index 0000000..de75ae6 --- /dev/null +++ b/src/cogs/verification.py @@ -0,0 +1,57 @@ +from discord.ext import commands +from discord.commands import SlashCommandGroup +from settings import ( + GUILD_IDS, VERIFICATION_CHANNEL_ID, VERIFIED_ROLE_ID, UNVERIFIED_ROLE_ID, SUPPORT_ROLE_ID +) +import asyncio + +class Verification(commands.Cog): + def __init__(self, bot): + self.bot = bot + self._last_member = None + + verification = SlashCommandGroup("verification", "Verify through the bot", guild_ids=GUILD_IDS) + + @verification.command(name="verify", guild_ids=GUILD_IDS, description="Verify yourself in the server using a command.") + async def verificar(self, ctx): + if ctx.channel.id == VERIFICATION_CHANNEL_ID: + verified = ctx.guild.get_role(VERIFIED_ROLE_ID) + unverified = ctx.guild.get_role(UNVERIFIED_ROLE_ID) + support_role = ctx.guild.get_role(SUPPORT_ROLE_ID) + + if verified not in ctx.author.roles: + await ctx.author.add_roles(unverified) + await ctx.send(f"{ctx.author.mention}, please specify your origin (CurseForge/SpigotMC) or enter the secret code to get verified.") + + try: + # Esperar la respuesta del usuario en el mismo canal + response = await self.bot.wait_for( + "message", + check=lambda message: message.author == ctx.author and message.channel == ctx.channel, + timeout=120 # Puedes ajustar el tiempo límite según tus necesidades + ) + + # Verificar la respuesta del usuario + if "CurseForge" in response.content or "SpigotMC" in response.content: + await ctx.author.add_roles(support_role) + await ctx.author.remove_roles(unverified) + await ctx.send(f"{ctx.author.mention} has been verified from CurseForge or SpigotMC!") + await ctx.channel.purge(limit=100) + elif "cHV0b3RvbnRvWEQ=" in response.content: + await ctx.author.add_roles(verified) + await ctx.author.remove_roles(unverified) + await ctx.send(f"{ctx.author.mention} has been verified using the secret code!") + await ctx.channel.purge(limit=100) + else: + await ctx.respond("Invalid response. Please specify CurseForge/SpigotMC or the secret code.", ephemeral=True) + + except asyncio.TimeoutError: + await ctx.respond("Verification process timed out. Please run the command again.", ephemeral=True) + + else: + await ctx.respond("You are already verified.", ephemeral=True) + else: + await ctx.respond(f"You can only verify in <#{VERIFICATION_CHANNEL_ID}>.", ephemeral=True) + +def setup(bot): + bot.add_cog(Verification(bot)) \ No newline at end of file diff --git a/src/settings.py b/src/settings.py new file mode 100644 index 0000000..99c774b --- /dev/null +++ b/src/settings.py @@ -0,0 +1,134 @@ + ##### ####### # # ####### ### ##### # # ###### # ##### ### ####### # # + # # # # ## # # # # # # # # # # # # # # # # ## # + # # # # # # # # # # # # # # # # # # # # # # + # # # # # # ##### # # #### # # ###### # # # # # # # # # + # # # # # # # # # # # # # # ####### # # # # # # # + # # # # # ## # # # # # # # # # # # # # # # # ## + ##### ####### # # # ### ##### ##### # # # # ##### ### ####### # # + +# Configuración de parámetros de Discord +DISCORD_LOGO = "resources/images/logo.png" # png/jpg +DISCORD_INVITE = "https://discord.gg/wSx82bUrFT" # https://discord.gg/TU_INVITACIÓN +ADMIN_CHANNEL_ID = 1212498847138447450 # canal para enviar mensajes del bot para admins +ADMIN_ROLE_ID = 1093755241494749274 # id del rol de admin obtenido con dev mode +ANNOUNCES_CHANNEL_ID = 1242621232281813082 # Canal para enviar anuncios, normalmente el propio canal de anuncios de una comunidad de Discord. +WELCOME_CHANNEL_ID = 1212311179846746124 # canal de bienvenidas +VERIFICATION_CHANNEL_ID = 0000000000000000000 # canal de verificación +VERIFIED_ROLE_ID = 0000000000000000000 # rol verificado +UNVERIFIED_ROLE_ID = 0000000000000000000 # rol no verificado +COUNTER_CHANNEL_ID = 1244730885836767315 # canal de contador +GUILD_IDS = [925562720890277948] # id del servidor obtenido con dev mode ⚠️ DE MOMENTO SOLO SOPORTA UN SERVIDOR A LA VEZ ⚠️ +SUPPORT_ROLE_ID = 0000000000000000000 + +# Configuración de parámetros del bot +GUILD_NAME = "MIARMAPLACE" # nombre del servidor +BOT_LOGO ="resources/images/pype.png" # png/jpg +BOT_NAME = "Pype" # nombre a elegir +BOT_TOKEN = "MTAyMDg5MzE2MDY0NzQzMDIyNg.GONoVo.ar4hT-d6JPG6Cpq9jJnafVkb3Z9EFsZY9ZVFVY" # token obtenido en la página de Discord Developers +VERSION = "1.0 Rewritten" # versión del bot +WAVELINK_URI = 'ether.lunarnodes.xyz:6969' # ip del servidor de Lavalink +WAVELINK_PASSWORD = "lunarnodes.xyz" # contraseña del servidor de Lavalink +SPOTIFY_CLIENT_ID = '' # id de la app de Spotify +SPOTIFY_CLIENT_SECRET = '' # secret de la app de Spotify +EMBED_COLOR = 0x2B2D31 +TIMEZONE = "Europe/Madrid" # zona horaria + +# Configuración de parámetros del owner +OWNER_NAME = "Gallardo7761" # nombre sin tag (#XXXX) +OWNER_ID = 318818322642763780 # id del owner obtenido con el dev mode + +# Cofiguración de parámetros del comando /help +INDICE = "ㅤ\n**★) ** 🪶 Varios\n\n**★) ** 👥 Interacción\n\n**★) ** 🧮 Matemáticas\n\n**★) ** 🎶 Música\n\n**★) ** 💻 Asciiart\n\n**★) ** ✅ Verificacion\n\n**★) ** 🆘 Help\n\n*En las siguientes páginas*\n*hay ayuda más detallada.*" +VARIOS = """ +**/misc ping** - Ping de Pype. +**/misc info** - Info del discord. +**/misc say** - Pype dice algo. +**/misc platano** - Banana! +**/misc dado** - Tira un dado de 6 caras. +**/misc moneda** - Tira una moneda al aire. +**/misc avatar** - Renderiza el avatar de un miembro del servidor. +**/misc wallpaper** - Wallpaper de anime (PC). +**/misc mobilewallpaper** - Wallpaper de anime (móvil). +**/misc paredes** - Están por las paredes. +**/misc oooh** - Ooooooooh! .- Exclamaron Mordecai y Rigby. +**/misc carey** - Navidad (?) +**/misc beber** - Bebe algo. +**/misc bombardeen** - Bombardeen algo. +""" +INTERACCION = """ +**/inter wave** - Di hola. +**/inter dance** - Saca los pasos prohibidos. +**/inter nice** - Noice. +**/inter nosebleed** - Ecsitante. +**/inter punch** - Cruzado o uppercut? +**/inter feed** - Alimenta a alguien. +**/inter tickle** - Hazle la tortura de las cosquillas a alguien. +**/inter bite** - Muerde~ a alguien. +**/inter hug** - Abraza a alguien. +**/inter kill** - Mata a alguien D: +**/inter kiss** - Besa a alguien UwU +**/inter pat** - Dale palmaditas a alguien. +**/inter slap** - A dar de hostias a alguien. +**/inter sleep** - A mimir. +**/inter cry** - Tas bien? :( +**/inter cuddle** - Acurrúcate con alguien u.u +**/inter lick** - Lame a alguien? +""" +INTERACCION_2 = """ +**/inter threaten** - Amenaza a alguien >:) +**/inter run** - Corre Forrest, corre! +**/inter fbi** - FBI OPEN UP! +**/inter spank** - Dale nalgadas a alguien. +**/inter ship** - Haz un ship entre dos personas. +**/inter moan** - Aaaaaaah~! +**/femboy** - Femboiza a alguien. +""" +NSFW = """ +**/nsfw creampie** Lechita. +**/nsfw hentai** Go to horny jail. +**/nsfw anal** Es la hora de dar por culo. +**/nsfw ass** Culito, culito! +**/nsfw bdsm** Atar? +**/nsfw doujin** Página random de un doujinshi. +**/nsfw fap** Fap fap fap fap. +**/nsfw ero** Fucking pervert. +**/nsfw yuri** Imagen yuri 🏳️‍🌈. +**/nsfw blowjob** * clk clk clk * +**/nsfw boobs** Tetas tetitas tetazas tetotas tetarracas. +**/nsfw pussy** Es temporada de recogida de higos. +**/nsfw boobjob** Tetas tetarracas + * clk clk clk * +**/nsfw gangbang** Muchas tuneladoras para un sólo túnel. +""" +MATEMATICAS = """ +**/mates contar** - Cuenta desde un número *a* hasta un número *b*. +**/mates calc** - Calcula expresiones matemáticas varias. +**/mates par** - Comprueba si un número es par o no. +**/mates primo** - Comprueba si un número es primo o no. +**/mates grafseno** - Grafica una función seno. +**/mates grafcoseno** - Grafica una función coseno. +**/mates grafrecta** - Grafica una función lineal. +**/mates grafparabola** - Grafica una función cuadrática. +**/mates grafcircunferencia** - Grafica una circunferencia. +**/mates graflog** - Grafica una función logarítmica. +**/mates grafexp** - Grafica una función exponencial. +""" +MUSICA = """ +**/musica play** - Reproduce una canción. +**/musica pause** - Pausa la reproducción. +**/musica resume** - Reanuda la reproducción. +**/musica skip** - Salta a la siguiente canción. +**/musica seek** - Avanza hacia delante o atrás en la canción. +**/musica join** - Conecta al bot al canal de voz. +**/musica leave** - Desconecta al bot al canal de voz. +**/musica volume** - Establece el volumen del bot. +**/musica loop** - Activa/Desactiva el bucle. +**/musica queue** - Mira la cola. +**/musica now** - Muestra lo que se está reproduciendo ahora mismo. +**/musica stop** - Para la canción. +""" +VERIFICACION = """ +**/verification verify** - Verifica tu cuenta. +""" +HELP = """ +**/help all** - Muestra este mensaje. +""" \ No newline at end of file diff --git a/src/utils/bot.py b/src/utils/bot.py new file mode 100644 index 0000000..62da4a8 --- /dev/null +++ b/src/utils/bot.py @@ -0,0 +1,34 @@ +from random import choice, randint +import csv + +def bot_status_randomizer(fichero) -> str: + listStatus = [] + with open(fichero, encoding="utf-8") as f: + lector = csv.reader(f) + next(lector) + for l in lector: + status = str(l[0]) + listStatus.append(status) + return choice(listStatus) + +def get_random_color() -> int: + return randint(0, 0xFFFFFF) + +def esPar(numero: int) -> str: + if numero % 2 == 0: + res = "Es par" + else: + res = "Es impar" + return res + +def esPrimo(numero: int) -> str: + if numero > 1: + for i in range(2, numero): + if (numero % i) == 0: + res = "No es primo" + break + else: + res = "Es primo" + else: + res = "No es primo" + return res \ No newline at end of file diff --git a/src/utils/embeds.py b/src/utils/embeds.py new file mode 100644 index 0000000..4a36f90 --- /dev/null +++ b/src/utils/embeds.py @@ -0,0 +1,42 @@ +import discord +from discord.ext import commands +from settings import EMBED_COLOR, TIMEZONE +from datetime import datetime +import pytz + +def crear_embed(ctx: commands.Context, + title: str, + description: str, + fields: str = None, + footer_text: str = None, + timestamp: bool = False, + author_name: str = None, + image_url: str = None, + thumbnail_url: str = None, + color: int = None): + def bool_parser(string): + if string.lower() == "true": + return True + elif string.lower() == "false": + return False + else: + raise commands.BadArgument("El valor debe ser True o False") + embed = discord.Embed(title=title, description=description, color=EMBED_COLOR) + if fields: + fields_list = fields.split(";;") + for field in fields_list: + name, value, inline = field.split(",,") + embed.add_field(name=name, value=value, inline=bool_parser(inline)) + if footer_text: + embed.set_footer(text=footer_text) + if image_url: + embed.set_image(url=image_url) + if thumbnail_url: + embed.set_thumbnail(url=thumbnail_url) + if author_name: + embed.set_author(name=author_name, icon_url=ctx.author.avatar.url) + if timestamp: + embed.timestamp = datetime.now(pytz.timezone(TIMEZONE)) + if color: + embed.color = color + return embed \ No newline at end of file diff --git a/src/utils/files.py b/src/utils/files.py new file mode 100644 index 0000000..fd69242 --- /dev/null +++ b/src/utils/files.py @@ -0,0 +1,17 @@ +import json + +def read(file: str) -> str: + with open(file, "r") as f: + return f.read() + +def read_json(file: str) -> dict: + with open(file, "r") as f: + return json.load(f) + +def write(file: str, content: str) -> None: + with open(file, "w") as f: + f.write(content) + +def write_json(file: str, content: dict) -> None: + with open(file, "w") as f: + json.dump(content, f, indent=4, sort_keys=True, separators=(',', ': '), ensure_ascii=False) \ No newline at end of file diff --git a/src/utils/logger/colors.py b/src/utils/logger/colors.py new file mode 100644 index 0000000..6250538 --- /dev/null +++ b/src/utils/logger/colors.py @@ -0,0 +1,13 @@ +class Colors: + RED = "\033[91m" + GREEN = "\033[92m" + YELLOW = "\033[93m" + BLUE = "\033[94m" + MAGENTA = "\033[95m" + CYAN = "\033[96m" + WHITE = "\033[97m" + RESET = "\033[0m" + BOLD = "\033[1m" + UNDERLINE = "\033[4m" + LIME = "\033[32m" + GRAY = "\033[90m" \ No newline at end of file diff --git a/src/utils/logger/pype_logger.py b/src/utils/logger/pype_logger.py new file mode 100644 index 0000000..f2b34d1 --- /dev/null +++ b/src/utils/logger/pype_logger.py @@ -0,0 +1,43 @@ +from .colors import Colors +from datetime import datetime +import pytz +import traceback + +class PypeLogger: + @staticmethod + def info(message): + now = datetime.now(tz=pytz.timezone("Europe/Madrid")).strftime("%H:%M:%S") + print(f"{Colors.GRAY}[{now}] {Colors.GREEN}[INFO] {message}{Colors.RESET}") + + @staticmethod + def error(message, exception=None): + now = datetime.now(tz=pytz.timezone("Europe/Madrid")).strftime("%H:%M:%S") + main_error = f"{Colors.GRAY}[{now}] {Colors.RED}[ERROR] {message}{Colors.RESET}" + error_messages = [main_error] + if exception: + exception_message = f"\n{Colors.GRAY}[{now}] {Colors.RED}[ERROR] - Exception: {exception}" + traceback_message = f"\n{Colors.GRAY}[{now}] {Colors.RED}[ERROR] - Traceback: {traceback.format_exc()}" + error_messages.append(exception_message) + error_messages.append(traceback_message) + for error_message in error_messages: + print(error_message) + + @staticmethod + def debug(message): + now = datetime.now(tz=pytz.timezone("Europe/Madrid")).strftime("%H:%M:%S") + print(f"{Colors.GRAY}[{now}] {Colors.BLUE}[DEBUG] {message}{Colors.RESET}") + + @staticmethod + def warning(message): + now = datetime.now(tz=pytz.timezone("Europe/Madrid")).strftime("%H:%M:%S") + print(f"{Colors.GRAY}[{now}] {Colors.YELLOW}[WARNING] {message}{Colors.RESET}") + + @staticmethod + def success(message): + now = datetime.now(tz=pytz.timezone("Europe/Madrid")).strftime("%H:%M:%S") + print(f"{Colors.GRAY}[{now}] {Colors.LIME}[SUCCESS] {message}{Colors.RESET}") + + @staticmethod + def command(message): + now = datetime.now(tz=pytz.timezone("Europe/Madrid")).strftime("%H:%M:%S") + print(f"{Colors.GRAY}[{now}] {Colors.MAGENTA}[COMMAND] {message}{Colors.RESET}") \ No newline at end of file diff --git a/src/utils/reactions.py b/src/utils/reactions.py new file mode 100644 index 0000000..2195232 --- /dev/null +++ b/src/utils/reactions.py @@ -0,0 +1,7 @@ +import discord + +async def añadir_reacciones(message: discord.Message, reactions: str, n: int) -> None: + reactions_list = reactions.split(";") + for i in range(n): + await message.add_reaction(reactions_list[i]) + i+=1 \ No newline at end of file