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/anime.py

410 lines
14 KiB
Python

import datetime
import random
import string
from typing import Optional
import aiohttp
from decouple import config
from discord import Embed
from discord.ext import menus
from discord.ext.commands import bot_has_permissions, Cog, group
from settings import rndColour, enso_embedmod_colours
my_waifu_list_auth = config('MYWAIFULIST_AUTH')
# Defining the full names of the waifu's/husbando's
anime = {"yumeko": "Jabami Yumeko",
"toga": "Himiko Toga",
"maki": "Maki Oze",
"kakashi": "Hatake Kakashi",
"tamaki": "Tamaki Suoh",
}
# Gets the member and user avatar
def getMember(msg):
# Set member as the author
member = msg.author
# Get the member avatar
userAvatar = member.avatar_url
return member, userAvatar
# Function to turn the user inputted name into the full name
def Abbrev(anime_msg):
# Get the lowercase
split_anime = anime_msg.split()
new_msg = ""
# For each word in split_anime
for word in split_anime:
# If the word exists in the anime array
if word in anime:
# Set a new string equal to the full name of the waifu/husbando
new_msg = anime[word]
return new_msg
def randomWaifu(msg, waifu):
"""Return Embed for Specific Waifu"""
# Retrieve a random image of a waifu within the bot
with open(f'images/AnimeImages/Waifus/{random.choice(waifu)}.txt') as file:
array = file.readlines()
# Get the member and the userAvatar
member, userAvatar = getMember(msg)
# Set up the embed for a random waifu image
waifu_embed = Embed(
title=f"Oh Look! A Wonderful Waifu! <a:huh:676195228872474643> <a:huh:676195228872474643> ",
colour=rndColour(),
timestamp=datetime.datetime.utcnow())
waifu_embed.set_image(url=random.choice(array))
waifu_embed.set_footer(text=f"Requested by {member}", icon_url='{}'.format(userAvatar))
return waifu_embed
def randomHusbando(msg, husbando):
"""Display embed for Specific Husbando"""
# Retrieve a random image of a husbando within the bot
with open(f'images/AnimeImages/Husbandos/{random.choice(husbando)}.txt') as file:
array = file.readlines()
# Get the member and the userAvatar
member, userAvatar = getMember(msg)
# Set up the embed for a random husbando image
husbando_embed = Embed(
title=f"Oh Look! A Handsome Husbando! <a:huh:676195228872474643> <a:huh:676195228872474643> ",
colour=rndColour(),
timestamp=datetime.datetime.utcnow())
husbando_embed.set_image(url=random.choice(array))
husbando_embed.set_footer(text=f"Requested by {member}", icon_url='{}'.format(userAvatar))
return husbando_embed
def displayAnimeImage(array, msg, name):
"""Setup Embed for Specific Waifu/Husbando"""
# Get the member and the userAvatar
member, userAvatar = getMember(msg)
# Set up embed for an image relating to a husbando or waifu
anime_embed = Embed(
title=f"**{name}**",
colour=rndColour(),
timestamp=datetime.datetime.utcnow())
anime_embed.set_image(url=random.choice(array))
anime_embed.set_footer(text=f"Requested by {member}", icon_url='{}'.format(userAvatar))
return anime_embed
def waifus():
"""List of Waifu's"""
return ["toga", "yumeko", "maki"]
def husbandos():
"""List of Husbando's"""
return ["kakashi", "tamaki"]
def store_waifus(waifus_dict, waifu, value):
waifus_dict[waifu["name"]][value] = waifu[value]
def embed_generator(waifus_dict):
embeds = []
for key in waifus_dict.values():
embed = Embed(title=key["name"], description=f"{key['original_name']} | {key['type']}",
colour=rndColour(),
url=key["url"])
embed.set_image(url=key["display_picture"])
embed.set_footer(text=f"❤️ {key['likes']} 🗑️ {key['trash']} | Powered by MyWaifuList")
embeds.append(embed)
return embeds
def get_dict(waifus_dict):
return waifus_dict
# Set up the Cog
class HelpMenu(menus.Menu):
def __init__(self, i, waifu, bot, botter):
super().__init__(timeout=125.0, clear_reactions_after=True)
self.waifus_dict = waifu
self.i = i
self.waifu = embed_generator(self.waifus_dict)
self.bot = bot
self.botter = botter
# Message to be sent on the initial command ~help
async def send_initial_message(self, ctx, channel):
# Set the first embed to the first element in the pages[]
initial = embed_generator(self.waifus_dict)[self.i]
cur_page = self.i + 1
pages = len(self.waifu)
initial.set_author(name=f"Page {cur_page}/{pages}")
# Send embed
return await channel.send(embed=initial)
# Reaction to allow user to go to the previous page in the embed
@menus.button('\N{LEFTWARDS BLACK ARROW}')
async def on_left_arrow(self, payload):
# Simple check to make sure that the reaction is performed by the user
def check(m):
return m.author == payload.member
# Do nothing if the check does not return true
if check(self.ctx):
# Set self.i to (i - 1) remainder length of the array
self.i = (self.i - 1) % len(embed_generator(self.waifus_dict))
prev_page = embed_generator(self.waifus_dict)[self.i]
cur_page = self.i + 1
pages = len(self.waifu)
prev_page.set_author(name=f"Page {cur_page}/{pages}")
# Send the embed and remove the reaction of the user
await self.message.edit(embed=prev_page)
if self.botter.guild_permissions.manage_messages:
await self.message.remove_reaction("", self.ctx.author)
# Reaction to allow user to go to the next page in the embed
@menus.button('\N{BLACK RIGHTWARDS ARROW}')
async def on_right_arrow(self, payload):
# Simple check to make sure that the reaction is performed by the user
def check(m):
return m.author == payload.member
# Do nothing if the check does not return true
if check(self.ctx):
# Set self.i to (i + 1) remainder length of the array
self.i = (self.i + 1) % len(embed_generator(self.waifus_dict))
next_page = embed_generator(self.waifus_dict)[self.i]
cur_page = self.i + 1
pages = len(self.waifu)
next_page.set_author(name=f"Page {cur_page}/{pages}")
# Send the embed and remove the reaction of the user
await self.message.edit(embed=next_page)
if self.botter.guild_permissions.manage_messages:
await self.message.remove_reaction("", self.ctx.author)
@menus.button('\N{BLACK SQUARE FOR STOP}\ufe0f')
async def on_stop(self, payload):
# Simple check to make sure that the reaction is performed by the user
def check(m):
return m.author == payload.member
# Do nothing if the check does not return true
if check(self.ctx):
# Delete the embed and stop the function from running
await self.message.delete()
self.stop()
class Anime(Cog):
"""Waifus and Husbandos!"""
def __init__(self, bot):
self.bot = bot
@Cog.listener()
async def on_ready(self):
"""Printing out that Cog is ready on startup"""
print(f"{self.__class__.__name__} Cog has been loaded!\n-----")
4 years ago
@group(invoke_without_command=True, aliases=["Waifu"])
@bot_has_permissions(embed_links=True, add_reactions=True)
async def waifu(self, ctx, *, waifu2: Optional[str] = None):
"""
Shows a Waifu (UNDER CONSTRUCTION)
Waifu's are grabbed from mywaifulist.com
"""
# Local Variable i to allow the index of the pages[] to be modified
i = 0
# When a waifu has been specified, retrieve waifu(s) matching the user input
if waifu2:
waifus_dict = {}
url = "https://mywaifulist.moe/api/v1/search/"
data = {"term": waifu2,
'content-type': "application/json"}
headers = {'apikey': my_waifu_list_auth}
# Searching API for waifu(s)
async with aiohttp.ClientSession() as session:
async with session.post(url, data=data, headers=headers) as resp:
# Store waifu's in dict when request is successful, else send an error
if resp.status == 200:
waifu_dict = await resp.json()
# Send error if something went wrong internally/while grabbing data from API
else:
await ctx.send("Something went wrong!")
# As long waifu's were returned from the GET request
# Store waifus in a dict
if len(waifu_dict["data"]) > 0:
for waifu in waifu_dict["data"]:
# Only store "Waifu's" and "Husbando's"
if waifu["type"] in ["Waifu", "Husbando"]:
waifus_dict[waifu["name"]] = {}
for value in waifu:
store_waifus(waifus_dict, waifu, value)
else:
break
# When no waifu has been retrieved, send error message to the user
else:
embed = Embed(description="**Waifu Not Found!**",
colour=enso_embedmod_colours)
await ctx.send(embed=embed)
# Get the instance of the bot
bot = ctx.guild.get_member(self.bot.user.id)
# Send the menu to the display
menu = HelpMenu(i, waifus_dict, self, bot)
await menu.start(ctx)
"""
name = waifu["name"]
og_name = waifu["original_name"]
picture = waifu["display_picture"]
url = waifu["url"]
likes = waifu["likes"]
trash = waifu["trash"]
embed = Embed(title=name, description=og_name,
colour=rndColour(),
url=url)
embed.set_image(url=picture)
embed.set_footer(text=f"❤️ {likes} 🗑️ {trash} | Powered by MyWaifuList")
"""
else:
# Set variables to retrieve data from the API
url = "https://mywaifulist.moe/api/v1/meta/random"
headers = {'apikey': my_waifu_list_auth}
# Retrieve a random waifu from the API
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers) as resp:
# Store waifu's in dict when request is successful, else send an error
if resp.status == 200:
waifu_dict = await resp.json()
waifu = waifu_dict["data"]
# Send error if something went wrong internally/while grabbing data from API
else:
await ctx.send("Something went wrong!")
# Get all the data to be displayed in the embed
name = waifu["name"]
og_name = waifu["original_name"]
picture = waifu["display_picture"]
url = waifu["url"]
likes = waifu["likes"]
trash = waifu["trash"]
waifu_type = waifu["type"]
embed = Embed(title=name, description=f"{og_name} | {waifu_type}",
colour=rndColour(),
url=url)
embed.set_image(url=picture)
embed.set_footer(text=f"❤️ {likes} 🗑️ {trash} | Powered by MyWaifuList")
await ctx.send(embed=embed)
4 years ago
@group(invoke_without_command=True, aliases=["Husbando"])
@bot_has_permissions(embed_links=True)
async def husbando(self, ctx, husbando: Optional[str] = None):
"""Shows a Husbando"""
if husbando:
# Get the lowercase
lcase_husbando = husbando.lower()
try:
# Retrieve image of the husbando specified
with open(f'images/AnimeImages/Husbandos/{lcase_husbando}.txt') as file:
h_array = file.readlines()
# Get the full name of the husbando
full_name = Abbrev(lcase_husbando)
# Embed the image into a message and send it to the channel
embed = displayAnimeImage(h_array, ctx, full_name)
await ctx.send(embed=embed)
except FileNotFoundError as e:
print(e)
# Send error message saying that the Husbando isn't recognised
embed = Embed(
description="Sorry! That Husbando Doesn't Exist!"
f"\nPlease Do **{ctx.prefix}husbando list** To View The List Of Husbando's Available",
colour=enso_embedmod_colours)
await ctx.send(embed=embed)
else:
# Get embed from randomHusbando() and send it to the channel
embed = randomHusbando(ctx, husbandos())
await ctx.send(embed=embed)
4 years ago
@waifu.command(name="list", aliases=["List"])
async def wlist(self, ctx):
"""Returns a list of Waifu's Available"""
# Send the list of waifus in the bot to the channel
waifu_list = string.capwords(', '.join(map(str, waifus())))
# Tell the user to try the waifus in the array
embed = Embed(description="Try The Waifu's Listed Below!"
f"\n**{waifu_list}**",
colour=enso_embedmod_colours)
await ctx.send(embed=embed)
4 years ago
@husbando.command(name="list", aliases=["List"])
async def hlist(self, ctx):
"""Returns a list of Husbando's Available"""
# Send the list of waifus in the bot to the channel
husbando_list = string.capwords(', '.join(map(str, husbandos())))
# Tell the user to try the husbando's in the array
embed = Embed(description="Try The Husbando's Listed Below!"
f"\n**{husbando_list}**",
colour=enso_embedmod_colours)
await ctx.send(embed=embed)
def setup(bot):
4 years ago
bot.add_cog(Anime(bot))