Added random_gif() Moved back from exception-handler cog to local error handling Updated !keepers to be season agnostic Added new !sync param to update and clear local guild Added error checking to !player command
144 lines
5.3 KiB
Python
144 lines
5.3 KiB
Python
import logging
|
|
import os
|
|
|
|
import discord
|
|
from discord import Object
|
|
from discord.ext import commands
|
|
from discord.ext.commands import Greedy, Context
|
|
from typing import Optional, Literal
|
|
|
|
logger = logging.getLogger('discord_app')
|
|
|
|
class Owner(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
@commands.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def load(self, ctx, *, cog: str):
|
|
try:
|
|
await self.bot.load_extension(f'cogs.{cog}')
|
|
logger.warning(f'Loaded {cog}')
|
|
except Exception as e:
|
|
await ctx.send(f'**ERROR:** {type(e).__name__} - {e}')
|
|
else:
|
|
await ctx.send('**SUCCESS**')
|
|
|
|
@commands.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def unload(self, ctx, *, cog: str):
|
|
try:
|
|
await self.bot.unload_extension(f'cogs.{cog}')
|
|
logger.warning(f'Unloaded {cog}')
|
|
except Exception as e:
|
|
await ctx.send(f'**ERROR:** {type(e).__name__} - {e}')
|
|
else:
|
|
await ctx.send('**SUCCESS**')
|
|
|
|
@commands.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def reload(self, ctx, *, cog: str):
|
|
try:
|
|
await self.bot.unload_extension(f'cogs.{cog}')
|
|
logger.warning(f'Unloaded {cog}')
|
|
await self.bot.load_extension(f'cogs.{cog}')
|
|
logger.warning(f'Reloaded {cog}')
|
|
except Exception as e:
|
|
await ctx.send(f'**ERROR:** {type(e).__name__} - {e}')
|
|
else:
|
|
await ctx.send('**SUCCESS**')
|
|
|
|
@commands.command(hidden=True)
|
|
@commands.is_owner()
|
|
async def fullreset(self, ctx):
|
|
cogs = ['players', 'transactions', 'admins', 'dice', 'fun', 'gameday']
|
|
|
|
for x in cogs:
|
|
try:
|
|
await self.bot.unload_extension(f'cogs.{x}')
|
|
logger.warning(f'Unloaded {x}')
|
|
except Exception as e:
|
|
await ctx.send(f'Failed to unload **{x}**')
|
|
|
|
for x in cogs:
|
|
try:
|
|
await self.bot.load_extension(f'cogs.{x}')
|
|
logger.warning(f'Loaded {x}')
|
|
except Exception as e:
|
|
await ctx.send(f'Failed to load **{x}**')
|
|
|
|
await ctx.send('**SUCCESS**')
|
|
|
|
# @commands.command(name='sync', hidden=True)
|
|
# @commands.is_owner()
|
|
# async def sync_command(self, ctx, sync_type: str = 'local'):
|
|
# sync = None
|
|
# await ctx.send('I will try to sync slash commands...')
|
|
# try:
|
|
# if sync_type == 'global':
|
|
# sync = await self.bot.tree.sync()
|
|
# else:
|
|
# sync = await self.bot.tree.sync(guild=discord.Object(os.environ.get('GUILD_ID')))
|
|
# logger.warning(f'sync: {sync}')
|
|
# except Exception as e:
|
|
# logger.error(f'failed to sync: {e}')
|
|
#
|
|
# await ctx.send(f'Just ran the sync. Here is the output:\n{sync}')
|
|
|
|
@commands.command(name='sync', help='~ current guild, * global -> current, ! clear and sync current')
|
|
@commands.is_owner()
|
|
async def sync(self, ctx: Context, guilds: Greedy[Object], spec: Optional[Literal['~', "*", '!', '^']] = None) -> None:
|
|
"""
|
|
!sync
|
|
This takes all global commands within the CommandTree and sends them to Discord. (see CommandTree for more info.)
|
|
!sync ~
|
|
This will sync all guild commands for the current contexts guild.
|
|
!sync *
|
|
This command copies all global commands to the current guild (within the CommandTree) and syncs.
|
|
!sync ^
|
|
This command will remove all guild commands from the CommandTree and syncs, which effectively removes all commands from the guild.
|
|
!sync 123 456 789
|
|
This command will sync the 3 guild ids we passed: 123, 456 and 789. Only their guilds and guild-bound commands.
|
|
"""
|
|
logger.info(f'{ctx.author.name} has initiated a sync from guild ID {ctx.guild.id}')
|
|
if not guilds:
|
|
if spec == "~":
|
|
synced = await ctx.bot.tree.sync(guild=ctx.guild)
|
|
elif spec == "*":
|
|
ctx.bot.tree.copy_global_to(guild=ctx.guild)
|
|
synced = await ctx.bot.tree.sync(guild=ctx.guild)
|
|
elif spec == "^":
|
|
ctx.bot.tree.clear_commands(guild=ctx.guild)
|
|
await ctx.bot.tree.sync(guild=ctx.guild)
|
|
synced = []
|
|
elif spec == '!':
|
|
await ctx.bot.tree.sync()
|
|
|
|
ctx.bot.tree.copy_global_to(guild=ctx.guild)
|
|
await ctx.bot.tree.sync(guild=ctx.guild)
|
|
|
|
ctx.bot.tree.clear_commands(guild=ctx.guild)
|
|
synced = await ctx.bot.tree.sync(guild=ctx.guild)
|
|
else:
|
|
synced = await ctx.bot.tree.sync()
|
|
|
|
await ctx.send(
|
|
f"Synced {len(synced)} commands {'globally' if spec is None else 'to the current guild.'}"
|
|
)
|
|
return
|
|
|
|
ret = 0
|
|
for guild in guilds:
|
|
try:
|
|
await ctx.bot.tree.sync(guild=guild)
|
|
except discord.HTTPException:
|
|
pass
|
|
else:
|
|
ret += 1
|
|
|
|
await ctx.send(f"Synced the tree to {ret}/{len(guilds)}.")
|
|
|
|
|
|
async def setup(bot):
|
|
await bot.add_cog(Owner(bot))
|