dragon-bot/app/cogs/cheeky_functions.py
2023-09-29 13:42:04 -07:00

282 lines
8.7 KiB
Python
Executable File

from discord import option
from discord.ext import commands
import core_utils
import discord
import random
import requests
import os
class Cheeky(commands.Cog):
def __init__(self, bot):
self.bot: commands.Bot = bot
@commands.slash_command(
guild_ids=None,
name="decide",
description="Separate your choices with the word 'or', or dont to get a yes/no response.",
)
@option(
name="question",
required=True,
description="Separate your choices with 'or', or enter a single option to get a yes/no answer.",
)
async def decide(self, ctx, question):
import random
choices = question.split(" or ")
if len(choices) > 1:
answer = random.choice(choices)
else:
answer = random.choice(["✅ Yes", "❌ No"])
if ctx.author.id == 83012791983673344 and random.randint(1, 100) == 50:
answer = answer + "\n\nbut also consider killing urself fr fr"
embed = discord.Embed(
description=answer,
color=discord.Color.green(),
type="rich",
)
embed.set_author(name="You asked me: %s" % question.title())
await ctx.respond(embed=embed)
@commands.command(name="coom", pass_context=True)
async def coom(self, ctx: commands.Context, id=None):
if ctx.message.author.id != core_utils.my_id:
return
message = list(await ctx.message.channel.history(limit=2).flatten())[-1]
if id:
message = await ctx.channel.fetch_message(id)
await ctx.message.delete()
for emoji in await ctx.message.guild.fetch_emojis():
await message.add_reaction(emoji)
@commands.slash_command(
guild_ids=None,
name="clap",
description="Returns your passed in text separated by 👏",
)
@option(
name="input_string",
input_type="str",
description="The text you want to split",
required=True,
)
async def clap(self, ctx: commands.Context, input_string: str):
if len(input_string.split()) == 1:
input_string = [char for char in input_string]
await ctx.respond(" :clap: ".join(input_string))
else:
await ctx.respond(" :clap: ".join(input_string.split()) + " :clap: ")
@commands.slash_command(
guild_ids=None,
debug_guild=826547484632678450,
name="greentext",
description="Posts a greentext image",
)
async def greentext(self, ctx: commands.Context):
import get_from_reddit
embed = discord.Embed(
description=">implying this actually happened",
color=discord.Color.green(),
type="rich",
)
embed.set_image(
url=get_from_reddit.get_image(
boards=["aigreentext", "greentext", "newgreentexts", "4chan"]
)
)
await ctx.respond(embed=embed)
@commands.slash_command(
guild_ids=None, name="roll", decide="Roll X number of N sided die", type=int
)
@option(name="num_of_dies", required=True, type=int)
@option(name="sides", required=True, description="Number of sides on your die")
@option(
name="number_to_add",
description="An optional number to add to your roll",
required=False,
default=None,
)
async def roll(
self, ctx: commands.Context, number_of_die, sides, number_to_add=None
):
import dice
await ctx.respond(embed=dice.roll(number_of_die, sides, number_to_add))
@commands.command(name="excuse")
async def excuse(self, ctx: commands.Context):
import excuse
await ctx.reply(excuse.get_excuse())
@commands.slash_command(
guild_ids=None,
name="meme",
description="Generate a dank classic meme. White bold text over an image",
)
@option(
name="template",
description="Which meme template you want to use",
required=True,
)
@option(name="top", description="The Top text to put on the meme", required=True)
@option(
name="bottom", description="The bottom text to put on the meme", required=True
)
async def meme(self, ctx: commands.Context, template, top, bottom):
import meme_gen
await ctx.defer()
await ctx.send_followup(
embed=core_utils.generate_embed(
embed_url=meme_gen.parse_message(template, top, bottom)
)
)
@commands.slash_command(
guild_ids=None,
name="wallpaper",
description="Queries unsplash's API for a wallpaper that matches your tags",
)
@option(
name="tags",
description="Space delimited tags you want to use as your query",
required=True,
)
async def wallpaper(self, ctx: commands.Context, tags):
import wallpaper
await ctx.defer()
await ctx.send_followup(
embed=core_utils.generate_embed(embed_url=wallpaper.get_wall(tags))
)
@commands.slash_command(name="donate")
async def donate(self, ctx: commands.Context):
await ctx.respond(
"https://paypal.me/ldooks\nhttps://venmo.com/ldooks\nhttps://cash.app/$ldooks"
)
@commands.slash_command(
guild_ids=None,
name="tiktok",
description="Returns a god awful tts with the tiktok voice",
)
@option(
name="input",
required=True,
description="The text you want as TTS",
max_length=300,
)
async def tiktok(self, ctx: commands.Context, input: str):
import tempfile
import base64
file, file_path = tempfile.mkstemp()
headers = {
"Content-Type": "application/json",
}
json_data = {
"text": input,
"voice": "en_us_001",
}
response = requests.post(
"https://tiktok-tts.weilnet.workers.dev/api/generation",
headers=headers,
json=json_data,
).json()
audio_file = base64.b64decode(response["data"])
with open(file_path, "wb") as f:
f.write(audio_file)
f.close()
os.rename(file_path, file_path + ".mp3")
await ctx.respond(file=discord.File(file_path + ".mp3"))
os.remove(file_path + ".mp3")
@commands.slash_command(
guild_ids=None, name="8ball", description="Ask the magic 8 ball a question"
)
@option(name="question", description="Your question", required=True)
async def eight_ball(self, ctx: commands.Context, question: str):
import eight_ball
result = eight_ball.check_8ball(question)
await ctx.respond(":8ball: %s :8ball:" % result)
@commands.command(name="flows")
async def flows(self, ctx: commands.Context):
import river_stats
result = river_stats.get_stats()
await ctx.reply(embed=result)
@commands.slash_command(
guild_ids=None,
name="tweet",
description="Returns an image of the pasted in message ID as a tweet",
)
@option(
name="message_id",
description="The message ID to turn into a tweet",
required=True,
)
async def twitter(self, ctx: commands.Context, message_id: str):
message = await ctx.channel.fetch_message(message_id)
author_avatar = message.author.avatar
response = requests.get(
"https://some-random-api.ml/canvas/tweet/?avatar=%s&username=%s&displayname=%s&comment=%s"
% (
author_avatar,
core_utils.gen_username()[:14],
message.author.display_name,
message.content[:999],
)
)
with open("/tmp/tweet.jpg", "wb") as f:
f.write(response.content)
# await ctx.message.delete()
await ctx.respond(file=discord.File("/tmp/tweet.jpg"))
@commands.slash_command(
guild_ids=None, name="lewd", description="Posts nsfw content"
)
async def lewd(self, ctx: commands.Context):
if not ctx.channel.is_nsfw():
await ctx.send("You can only use this command in NSFW channels")
return
# import lewds
# await ctx.send(
# embed=core_utils.generate_embed(
# embed_url=lewds.get_lewd(),
# embed_title="{} is being lewd".format(ctx.message.author.name),
# )
# )
await ctx.defer()
await ctx.send_followup(
embed=core_utils.generate_embed(
embed_title="{} is being lewd".format(ctx.author.name),
embed_url=core_utils.waifu_pics(
endpoint=random.choice(["waifu", "neko", "blowjob"]), nsfw=True
),
)
)
def setup(bot):
bot.add_cog(Cheeky(bot))