import asyncio import datetime from asyncio import sleep import discord from decouple import config from discord.ext import commands # Getting the Bot token from Environment Variables API_TOKEN = config('DISCORD_TOKEN') # Bot Initiation client = commands.Bot( # Create a new bot command_prefix="~", # Set the prefix description='Ensō~Chan!', # Set a description for the bot owner_id=154840866496839680) # Your unique User ID client.remove_command('help') # Instantiates a list for all the cogs extensions = ['cogs.WaifuImages', 'cogs.FunCommands', 'cogs.Music', 'cogs.HelpCommands', 'cogs.OwOText', 'cogs.Embeds', 'cogs.GetInfo', 'cogs.Reminder'] # Calls the cogs if __name__ == '__main__': for ext in extensions: client.load_extension(ext) @client.command() async def remind(ctx, time=None): author = ctx.message.author if time: await sleep(float(time)) await author.send("uwu") else: await author.send("owo") # Bot Status on Discord @client.event async def on_ready(): # Tells me that the bot is ready and logged in print('Bot is ready.') # Sets the bots status on discord for everyone to view await client.change_presence(activity=discord.Game(name="With Broken Hearts 💔💔")) # Bot ~Ping command in milliseconds @client.command(aliases=["Ping"]) @commands.has_any_role('Hamothy', 'Servant') async def ping(ctx): # Send the latency of the bot (ms) await ctx.send(f'Pong! {round(client.latency * 1000)}ms') # Bot Event for handling cooldown error @client.event async def on_command_error(ctx, error): if isinstance(error, commands.CommandOnCooldown): # Send an error message to the user telling them that the command is on cooldown message = await ctx.send(f'That command is on cooldown. Try again in {error.retry_after:,.2f} seconds.') # Let the user read the message for 2.5 seconds await asyncio.sleep(2.5) # Delete the message await message.delete() # Bot Event for handling missing argument error @client.event async def on_command_error(ctx, target: discord.member): if isinstance(target, commands.MissingRequiredArgument): # Send an error message to the user saying that an argument is missing message = await ctx.send("Uh oh! Couldn't find anyone to mention! Try again!") # Let the user read the message for 1.5 seconds await asyncio.sleep(1.5) # Delete the message await message.delete() # Bot Event for handling permission errors @client.event async def on_command_error(ctx, error): if isinstance(error, commands.CheckFailure): # Send an error message to the user saying that they don't have persmission to use this command message = await ctx.send("Uh oh! You don't have permission to use this command!") # Let the user read the message for 1.5 seconds await asyncio.sleep(1.5) # Delete the message await message.delete() # Bot event for new member joining, sending an embed introducing them to the server @client.event async def on_member_join(member): # Set the channel id to "newpeople" new_people = client.get_channel(669771571337887765) # Set the channel id to "general" general = client.get_channel(663651584399507481) # Surround with try/except to catch any exceptions that may occur try: # Set up embed for the #newpeople channel embed = discord.Embed(title="\n**Welcome To Ensō!**", colour=discord.Colour(0x30e419)) embed.timestamp = datetime.datetime.utcnow() embed.set_thumbnail(url="https://media.discordapp.net/attachments/683490529862090814/715010931620446269" "/image1.jpg?width=658&height=658") embed.set_image( url="https://cdn.discordapp.com/attachments/714671068941647933/717144047252275270/f4d7de6463d3ada02058a094fd6917ac.gif") embed.add_field( name="\u200b", value=f"Hello {member.mention}! We hope you enjoy your stay in this server! ", inline=False) embed.add_field( name="\u200b", value=f"Be sure to check out our <#669815048658747392> channel to read the rules and <#683490529862090814> channel to get caught up with any changes! ", inline=False) embed.add_field( name="\u200b", value=f"Last but not least, feel free to go into <#669775971297132556> to introduce yourself!", inline=False) # Send embed to #newpeople await new_people.send(embed=embed) # Set hamothyID equal to my id in discord hamothyID = '<@&715412394968350756>' # String for welcoming people in the #general channel general_welcome = f"Welcome to the server! {member.mention} I hope you enjoy your stay here " \ f"\nPlease go into <#722347423913213992> to choose some ping-able roles for events! " \ f"\nPlease ping {hamothyID} for any questions about the server and of course, the other staff members!" # Send welcome message to #general await general.send(general_welcome) except Exception as ex: print(ex) # Allowing people to get ping-able self roles @client.command(name="rolemenu") @commands.has_any_role('Hamothy') async def role_menu(ctx): # Surround with try/except to catch any exceptions that may occur try: # Get the channel id of #self-roles channel = client.get_channel(722347423913213992) # Set up embed to let people know what ping-able roles can be chosen embed = discord.Embed(title="**Role Menu: Ping-Able Roles**", colour=discord.Colour.orange()) embed.timestamp = datetime.datetime.utcnow() embed.set_thumbnail(url="https://media.discordapp.net/attachments/683490529862090814/715010931620446269" "/image1.jpg?width=658&height=658") embed.set_author(name="Hamothy", icon_url="https://cdn.discordapp.com/attachments/689525645734182916" "/718510466640642099/Rias_Gremory.png") embed.set_footer(text=f"{ctx.message.author}", icon_url="https://media.discordapp.net/attachments/689525645734182916/718510466640642099/Rias_Gremory.png") embed.add_field( name="\u200b", value="React to give yourself roles to be pinged for these events!", inline=False) embed.add_field( name="\u200b", value="<:MovieNight:722293598938333190> : `Movie Nights`", inline=False) embed.add_field( name="\u200b", value="<:Karaoke:722358251932483605> : `Karaoke Nights`", inline=False) embed.add_field( name="\u200b", value="<:EnsoBros:722360289345011743> : `Enso Bros Podcasts`", inline=False) embed.add_field( name="\u200b", value="<:GameNights:722502073769525268> : `Game Nights`", inline=False) # Send embed to #self-roles await channel.send(embed=embed) except Exception as e: print(e) # Bot event for enabling roles to be added to users when they react to the embedded message @client.event async def on_raw_reaction_add(payload): # Surround with try/except to catch any exceptions that may occur try: # If the message id equals the self roles message if payload.message_id == 722514840559812649: # Print out the emoji name print(payload.emoji.name) # Find a role corresponding to the Emoji name. guild_id = payload.guild_id # Find the guild Enso and find the role of the emoji that has been reacted to guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds) role = discord.utils.find(lambda r: r.name == payload.emoji.name, guild.roles) # if the role does exist if role is not None: # Print to me that the role was found and display the id of the role print(role.name + " was found!") print(role.id) # Find the member who had reacted to the emoji member = discord.utils.find(lambda m: m.id == payload.user_id, guild.members) # Add the role to the member await member.add_roles(role) # Print to me that the role has been added print("done") except Exception as e: print(e) # Bot event for enabling roles to be removed from users when they unreact to the embedded messaged @client.event async def on_raw_reaction_remove(payload): # Surround with try/except to catch any exceptions that may occur try: # If the message id equals the self roles message if payload.message_id == 722514840559812649: # Print out the emoji name print(payload.emoji.name) # Get the server id guild_id = payload.guild_id # Find the guild Enso and find the role of the emoji that has been unreacted to guild = discord.utils.find(lambda g: g.id == guild_id, client.guilds) role = discord.utils.find(lambda r: r.name == payload.emoji.name, guild.roles) # if the role does exist if role is not None: # Find the member that has the role which the emoji is connected to member = discord.utils.find(lambda m: m.id == payload.user_id, guild.members) # Remove the role from the member await member.remove_roles(role) except Exception as ex: print(ex) # Run the bot, allowing to come online try: client.run(API_TOKEN) except discord.errors.LoginFailure as e: print("Login unsuccessful.") ''' @client.command() @commands.has_any_role('Hamothy') async def users(ctx): server_id = client.get_guild(663651584399507476) await ctx.send(f"""Number of Members: {server_id.member_count}""") ''' """ @client.event async def on_message(message, target: discord.Member,): player1 = message.author.mention player2 = target.mention channel = message.channel if message.content.startswith('~punch'): channel = message.channel await channel.send(f"**Deathmatch started! {player1} vs {player2}**" f"\n What do you want to do {message.author}?" f"\n 1) Punch" f"\n 2) Kick") def check(m): return m.content == 'punch' and m.channel == channel msg = await client.wait_for('f"**{player1} punched {player2} for {punch(p2)} damage!**"', check=check) await channel.send(msg) @client.event async def on_message(message): if message.content.startswith('~hello'): channel = message.channel await channel.send('Say hello!') def check(m): return m.content == 'hello' and m.channel == channel msg = await client.wait_for('message', check=check) await channel.send('Hello {.author}!'.format(msg)) def check(author): def inner_check(message): return message.author == author and message.content == "Hello" return inner_check msg = await client.wait_for('message', check=check(ctx.author), timeout=30) await ctx.send(msg) # def check(m): # return m.content == 'punch' and m.channel == channel # = await client.wait_for('message', check=check) # await channel.send(f"**{player1} punched {player2} for {punch(p2)} damage!**") except Exception as e: print(e) @client.command(aliases=["dm"]) async def deathmatch(ctx, target: discord.Member): player1 = ctx.author.mention player2 = target.mention channel = ctx.channel p1 = 100 p2 = 100 await ctx.send(f"**Deathmatch started! {player1} vs {player2}**" f"\n What do you want to do {ctx.author}?" f"\n 1) Punch" f"\n 2) Kick") def check(m): return m.content == 'punch' and m.channel == channel msg = await client.wait_for('message', check=check) await channel.send(msg) def punch(p2, player1, player2): damage = random.randint(1, 100) p2 -= damage return f"**{player1} punched {player2} for {punch(p2)} damage!**" """