You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Fox-V3/dad/dad.py

123 lines
4.0 KiB

from collections import defaultdict
from datetime import datetime, timedelta
import aiohttp
import discord
from redbot.core import Config, checks, commands
from redbot.core.bot import Red
from redbot.core.commands import Cog
async def fetch_url(session, url):
async with session.get(url) as response:
assert response.status == 200
return await response.json()
class Dad(Cog):
"""
Dad jokes
Nicknaming user idea comes from https://github.com/Vexs/DadBot
"""
def __init__(self, bot: Red):
super().__init__()
self.bot = bot
self.config = Config.get_conf(self, identifier=6897100, force_registration=True)
default_guild = {"enabled": True, "nickname": False, "cooldown": 240}
self.config.register_guild(**default_guild)
self.cooldown = defaultdict(datetime.now)
async def red_delete_data_for_user(self, **kwargs):
"""Nothing to delete"""
return
@commands.command()
async def dadjoke(self, ctx: commands.Context):
headers = {
"User-Agent": "FoxV3 (https://github.com/bobloy/Fox-V3)",
"Accept": "application/json",
}
async with aiohttp.ClientSession(headers=headers) as session:
joke = await fetch_url(session, "https://icanhazdadjoke.com/")
await ctx.maybe_send_embed(joke["joke"])
# print(joke)
#
# em = discord.Embed()
# em.set_image(url="https://icanhazdadjoke.com/j/{}.png".format(joke["id"]))
#
# await ctx.send(embed=em)
@commands.group()
@checks.admin()
async def dad(self, ctx: commands.Context):
"""Dad joke superhub"""
pass
@dad.command(name="toggle")
async def dad_toggle(self, ctx: commands.Context):
"""Toggle automatic dad jokes on or off"""
is_on = await self.config.guild(ctx.guild).enabled()
await self.config.guild(ctx.guild).enabled.set(not is_on)
await ctx.send("Auto dad jokes are now set to {}".format(not is_on))
@dad.command(name="nickname")
async def dad_nickname(self, ctx: commands.Context):
"""Toggle nicknaming"""
is_on = await self.config.guild(ctx.guild).nickname()
await self.config.guild(ctx.guild).nickname.set(not is_on)
await ctx.send("Nicknaming is now set to {}".format(not is_on))
@dad.command(name="cooldown")
async def dad_cooldown(self, ctx: commands.Context, cooldown: int):
"""Set the auto-joke cooldown in seconds"""
await self.config.guild(ctx.guild).cooldown.set(cooldown)
self.cooldown[ctx.guild.id] = datetime.now()
await ctx.send("Dad joke cooldown is now set to {} seconds".format(cooldown))
@commands.Cog.listener()
async def on_message_without_command(self, message: discord.Message):
guild: discord.Guild = getattr(message, "guild", None)
if guild is None:
return
guild_config = self.config.guild(guild)
is_on = await guild_config.enabled()
if not is_on:
return
if self.cooldown[guild.id] > datetime.now():
return
cleaned_content = message.clean_content
content_split = cleaned_content.split()
if len(content_split) == 0:
return
if content_split[0].lower() == "i'm" and len(content_split) >= 2:
if await guild_config.nickname():
try:
await message.author.edit(nick=cleaned_content[4:])
except discord.Forbidden:
out = cleaned_content[4:]
else:
out = message.author.mention
else:
out = cleaned_content[4:]
try:
await message.channel.send(f"Hi {out}, I'm {guild.me.display_name}!")
except discord.HTTPException:
return
self.cooldown[guild.id] = datetime.now() + timedelta(
seconds=(await guild_config.cooldown())
)