You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Enso-Bot/cogs/FunCommands.py

389 lines
19 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import asyncio
import datetime
import random
from aiohttp import request
from discord import Member, Colour, Embed
from discord.ext import commands
from discord.ext.commands import BucketType, cooldown, command, has_any_role, is_owner
import settings
from cogs.anime.interactive import error_function
# Set up the cog
class Fun(commands.Cog):
def __init__(self, bot):
self.bot = bot
# ~attack command for only co-owners only
@command(name="attack", aliases=['Attack'])
@has_any_role(664585078487252993, 715412394968350756)
async def attack(self, ctx, target: Member):
# Set up array of insults to throw at people
responses = [
f"{target.mention} is stinky",
f"{target.mention} is ugly",
f"{target.mention} has a gigantic nose",
f"{target.mention} gets no views on their tiktok",
f"{target.mention} is obviously compensating for something :eyes:",
f"{target.mention} DIE DIE DIE :knife: :skull:",
f"{target.mention} is so annoying smh :rolling_eyes:",
f"I'd say {target.mention} was dropped as a child but they would have be to held to dropped in the first place",
f"I hate {target.mention}",
f"{target.mention} close your legs, it smells like clam chowder :face_vomiting: :face_vomiting: :nauseated_face: :nauseated_face:",
f"I bet {target.mention} can't reach the wall cabinets without a booster chair",
f"{target.mention} Browses 4Chan and Reddit all day looking for love",
f"{target.mention} Your forehead could be used as a landing pad",
f"I bet {target.mention} likes eating watermelon with the rind.",
f"{target.mention} You were the first creation to make god say oops",
f"{target.mention} You have delusions of adequacy",
f"{target.mention} I treasure the time I don't spend with you",
f"Don't be ashamed of yourself {target.mention}, that's your parent's job",
f"I don't have the energy to pretend I like {target.mention} today",
f"I know this was made for me to insult but its kinda hard to be a hateful cunt like {target.mention} :star_struck::star_struck:",
f"#{target.mention}IsOverParty",
f"I hope {target.mention} drops dead with a curable disease that doctors simply didnt feel like curing :)",
f"{target.mention} You know there's no vaccine for stupidity right?",
f"{target.mention} You are not very epic at all",
f"You make Kpop Fancams 24/7 for validation on the internet {target.mention}",
f"Your mother wanted to drop you on the head when you were little {target.mention}",
f"{target.mention} You're the CEO of Racism",
f"{target.mention} has no common sense"
]
# Sending out a random insult from the array "responses"
await ctx.send(random.choice(responses))
# ~compliment command for everyone to use to compliment someone
@command(name="comp", aliases=['Comp', 'Compliment'])
# Added a cooldown, only 1 instance of the command can be sent every second per user
@cooldown(1, 1, BucketType.user)
async def compliment(self, ctx, target: Member):
# Set up array of compliments to throw at people
responses = [
f"{target.mention} is the most adorable uwu <:awie:676201100793085952> <:awie:676201100793085952> <:awie:676201100793085952>",
f"{target.mention} You have my ENTIRE HEART <:blushlook1:677310734123663363> <:blushlook2:679524467248201769>",
f"{target.mention} Hun you're CUTE uwu :pleading_face: :flushed: :pleading_face: :flushed: :pleading_face:",
f"I love {target.mention} so so much :heartbeat: :heartbeat: :heartbeat: ",
f"My heart is full of love for you {target.mention} <:Kawaii:676203363922214953> <:Kawaii:676203363922214953>",
f"{target.mention} I admire your greatness so much that I consider making a fan club to become your #1 fan (´꒳`)",
f"{target.mention} has no flaws, only special effects :))",
f"{target.mention}'s smile is brighter than sunlight, so smile more often ( ◠‿◠ )",
f"{target.mention} Your smile is so beautiful it blinds me :heart_eyes: :heart_eyes:",
f"Being on a journey all my life, I will never meet a person as amazing as you are {target.mention}",
f"Such a pleasure to be on the same sever with {target.mention} <:boneappleteeth:676202300573876252> <:boneappleteeth:676202300573876252>",
f"With {target.mention}, even the worst day will be filled with joy <:hug:718248629034549299> <:hug:718248629034549299>",
f"There's no better antidepressant than {target.mention}",
f"{target.mention} You're great, keep going Σd(˘ꇴ˘๑)",
f"I'd simp for {target.mention} anyday :flushed: :heart_eyes: :flushed: ",
f"{target.mention} Even the ugliest clothes won't ruin your look (。•̀ᴗ -)☆",
f"{target.mention} Youre that “nothing” when people ask me what Im thinking about <:Kawaii:676203363922214953> <:Kawaii:676203363922214953>",
f"{target.mention} Somehow you make time stop and fly at the same time <:awie:676201100793085952> <:blushlook1:677310734123663363>",
f"{target.mention} is a whole ass SWAGMEAL <:Kawaii:676203363922214953> <:Kawaii:676203363922214953>",
f"After meeting {target.mention}, I couldn't imagine living my life without them",
f"Take me into your arms and tell me you love me <:blushlook1:677310734123663363> <:blushlook2:679524467248201769> {target.mention}",
f"{target.mention} I would spend eternity cuddling with you :flushed: :flushed:",
f"Would you want to go on an e-date together? :pleading_face: :point_right: :point_left: {target.mention}",
f"Let me shoot my shot to you :see_no_evil: :see_no_evil: {target.mention}",
f"Your existence makes me feel so much better {target.mention}",
f"You're so hot, even hotter than hell :heart_eyes: {target.mention}",
f"{target.mention} Youre so cute that Taz will simp for you anytime :flushed: :heart_eyes: :flushed:",
f"Josh would kill Toga for you anyday {target.mention}",
f"Zara would pick you over Kakashi :heart_eyes: :heart_eyes: {target.mention}",
f"{target.mention} The thought of you leaving me is too much to bear. Stay with me forever :pleading_face: :pleading_face:",
f"{target.mention}From a scale of 1-10, youre 9 Im the 1 you need <:Kawaii:676203363922214953> <:Kawaii:676203363922214953> <:Kawaii:676203363922214953> ",
f"You're... You're SHREKTACULAR :heart_eyes: :flushed: :heart_eyes: {target.mention}",
f"{target.mention} Your beauty renders me speechless... :heart_eyes: :heart_eyes:",
f"Your taste in music is impeccable {target.mention}",
f"{target.mention}I can't stop thinking about you :see_no_evil: :see_no_evil:",
f"{target.mention} Your wedding will be wonderful, but the y is silent <a:huh:676195228872474643> <a:huh:676195228872474643>",
f"{target.mention} Hammy would give up his lifelong goals just to have a chance with you <a:huh:676195228872474643> <a:huh:676195228872474643>",
]
# Sending out a random compliment from the array "responses"
await ctx.send(random.choice(responses))
# ~8Ball command
@command(name="8ball", aliases=['8Ball'])
# Added a cooldown, only 1 instance of the command can be sent every second per user
@cooldown(1, 1, BucketType.user)
async def _8ball(self, ctx, *, question):
# Setting up the channels that the commands can be sent in enso-chan-commands and general
channels = ["enso-chan-commands", "general", "picto-chat"]
# Surround with try/except to catch any exceptions that may occur
try:
# If the channel that the command has been sent is in the list of accepted channels
if str(ctx.channel) in channels:
# Open the file containing all the custom eightball responses
with open('images/FunCommands/eightball.txt') as file:
# Store the eightball responses in an array
_8ball_array = file.readlines()
# Repeat the user question and send out a random response from _8ball_array
await ctx.send(f'Question: {question}\nAnswer: {random.choice(_8ball_array)}')
# else the command is sent in an invalid channel
else:
# Call error_function() and display it to the user
message = await ctx.send(error_function())
# Let the user read the message for 2.5 seconds
await asyncio.sleep(2.5)
# Delete the message
await message.delete()
except FileNotFoundError as e:
print(e)
# ~Lukas command that only Lukas can use
@command(name="lukas", aliases=['Lukas'])
# Added a cooldown, only 1 instance of the command can be sent every second per user
@cooldown(1, 1, BucketType.user)
@has_any_role('Lukas (Server Booster)')
async def lukas(self, ctx):
# Define the id's of Bubz and Lukas
lukasID = '<@395653002050011166>'
bubzID = '<@422588717744652289>'
# Set up array of responses that Lukas wants the bot to display
responses = [
f"{lukasID} loves {bubzID} with all his heart <:awie:676201100793085952> <:awie:676201100793085952>",
f"{lukasID} and {bubzID} are raising their rabbits <:blushlook1:677310734123663363> <:blushlook2:679524467248201769>",
f"{lukasID} is having a cult meeting",
f"{bubzID} is {lukasID}s Ehefrau"]
# Send one of the responses of the responses array to Lukas
await ctx.send(random.choice(responses))
# ~Flip command to allow for 50/50 chance decisions
@command(name="flip", aliases=['Flip'])
@cooldown(1, 1, BucketType.user)
async def flip(self, ctx):
# Define 3 arrays that only have 2 strings stored in them
pp_array = ["Smol pp", "Huge pp"]
pewds_array = ["Floor Gang", "Ceiling Gang"]
# Creating a 50/50 chance by choosing the array first
responses = random.choice([pp_array, pewds_array])
# Send out one of the responses stored in the array
await ctx.send(f"{ctx.author.mention} {random.choice(responses)}")
# ~dm only allows me to dm anyone through the bot
@command(name="dm", aliases=["DM", "dM"])
@is_owner()
async def dm(self, ctx, member: Member, *, text):
# Send the message typed the mentioned user
await member.send(text)
# Delete the message sent instantly
await ctx.message.delete()
# ~remindme command to allow the bot to dm you to remind you of something
@command(name="remindme", aliases=["Remindme", "rm"])
async def remind_me(self, ctx, time=None, *, text):
# Grab the author and store it in "author"
author = ctx.author
# If a value for time as been given
if time:
# Sleep the thread for the amount of time specified by the user
await asyncio.sleep(float(time))
# Send message to user's dms
await author.send(text)
# else no time has been given
else:
# Instantly Send message to user's dms
await author.send(text)
# ~digby command that allows users to see a picture of digby
@command(name="digby", aliases=["Digby"])
async def digby(self, ctx):
# Surround with try/except to catch any exceptions that may occur
try:
# Open the file containing the digby images
with open('images/digby.txt') as file:
# Store content of the file in digby_array
digby_array = file.readlines()
# Set member as the author
member = ctx.message.author
# Get the member avatar
userAvatar = member.avatar_url
# Set up the embed to display a random image of digby
embed = Embed(
title=f"**A cute picture of Digby!**",
colour=Colour(int(random.choice(settings.colour_list))),
timestamp=datetime.datetime.utcnow())
embed.set_image(url=random.choice(digby_array))
embed.set_footer(text=f"Requested by {member}", icon_url='{}'.format(userAvatar))
# Send the embedded message to the user
await ctx.send(embed=embed)
except FileNotFoundError as e:
print(e)
# ~Doggo command that uses an API to grab images of dogs
@command(name="doggo", aliases=["Doggo"])
@cooldown(1, 1, BucketType.user)
async def doggo(self, ctx, breed=None):
# If the channel that the command has been sent is in the list of accepted channels
if str(ctx.channel) in settings.channels:
# Set member as the author
member = ctx.message.author
# Get the member avatar
userAvatar = member.avatar_url
# Initialise array to store doggo pics
b_list = []
# If a breed if specified
if breed:
# Get the lowercase string input
lowercase_breed = breed.lower()
# If the user wants to know what breeds there are
if lowercase_breed == "breeds":
# Get the list of breeds
breed_url = "https://dog.ceo/api/breeds/list/all"
# Using API, retrieve the full list of breeds available
async with request("GET", breed_url, headers={}) as response:
if response.status == 200:
data = await response.json()
breed_link = data["message"]
# Store every Doggo in an array
for doggo in breed_link:
b_list.append(doggo)
# Define a new string to store the Doggo's nicely formatted
string = " "
for b in b_list:
string += (b + ", ").capitalize()
# Tell the user to try the breeds listed below
await ctx.send(f"Try the Breeds listed below!" +
f"\n {string}")
# If no breed has been specified
else:
# Grab a random image of a doggo with the breed specified
image_url = f"https://dog.ceo/api/breed/{lowercase_breed}/images/random"
# Using API, retrieve the image of a doggo of the breed specified
async with request("GET", image_url, headers={}) as response:
if response.status == 200:
data = await response.json()
image_link = data["message"]
# Set up the embed for a doggo image
doggo_embed = Embed(
title=f"**It's a {lowercase_breed.capitalize()} Doggo!!** ",
colour=Colour(random.choice(settings.colour_list)),
timestamp=datetime.datetime.utcnow())
doggo_embed.set_image(url=image_link)
doggo_embed.set_footer(text=f"Requested by {member}", icon_url='{}'.format(userAvatar))
# Send the doggo image
await ctx.send(embed=doggo_embed)
else:
# Send error message that Doggo was not found!
await ctx.send(
"Doggo Not Found! Please do **~doggo breeds** to see the full list of Doggos!")
else:
# Grab a random image of a doggo of any breed
image_url = "https://dog.ceo/api/breeds/image/random"
# Using API, retrieve the image of a doggo of any breed
async with request("GET", image_url, headers={}) as response:
if response.status == 200:
data = await response.json()
image_link = data["message"]
# Set up the embed for a random doggo image
doggo_embed = Embed(
title=f"**Doggo!!** ",
colour=Colour(random.choice(settings.colour_list)),
timestamp=datetime.datetime.utcnow())
doggo_embed.set_image(url=image_link)
doggo_embed.set_footer(text=f"Requested by {member}", icon_url='{}'.format(userAvatar))
# Send random doggo image to the channel
await ctx.send(embed=doggo_embed)
else:
# Send error message that Doggo was not found!
await ctx.send(
"Doggo Not Found! Please do **~doggo breeds** to see the full list of Doggos!")
else:
# Call error_function() and display it to the user
message = await ctx.send(error_function())
# Let the user read the message for 2.5 seconds
await asyncio.sleep(2.5)
# Delete the message
await message.delete()
# ~marry command allows the bot to wed two young lovers together
@command(name="marry", aliases=["Marry"])
async def marry(self, ctx, member: Member):
# Send a message to the channel mentioning the author and the person they want to wed.
await ctx.send(f"{ctx.author.mention} **Proposes To** {member.mention} **Do you accept??** "
f"\nRespond with [**Y**es/**N**o]")
# A check that makes sure that the reply is not from the author
# and that the reply is in the same channel as the proposal
def check(m):
return m.author == member and m.channel == ctx.channel
# Surround with try/except to catch any exceptions that may occur
try:
# Wait for the message from the mentioned user
msg = await self.bot.wait_for('message', check=check, timeout=30)
# if the person says yes
if msg.content.lower() in ['y', 'yes', 'yea']:
# Congratulate them!
await ctx.send(
f"Congratulations! ヽ(・∀・)ノ {ctx.author.mention} and {member.mention} are now married to each other!")
# if the person says no
elif msg.content.lower() in ['n', 'no', 'nah']:
# Try to console the person and wish them the best in their life
await ctx.send(f"Unlucky (T▽T), maybe another time! {ctx.author.mention}")
else:
# Abort the process as the message sent did not make sense
await ctx.send("Senpaiiii! Speak English Please ⋋_⋌")
except asyncio.TimeoutError as ex:
print(ex)
# Send out an error message if the user waited too long
await ctx.send("Awww they waited too long (✖╭╮✖)")
def setup(bot):
bot.add_cog(Fun(bot))