Brandon209-Red-bot-Cogs/disable/disable.py

87 lines
2.7 KiB
Python

from redbot.core.utils.chat_formatting import *
from redbot.core import Config, checks, commands
from redbot.core.utils.mod import is_admin_or_superior
from discord.ext.commands import DisabledCommand
from typing import Literal
import discord
class DisabledError(commands.CheckFailure):
pass
DEFAULT_MSG = warning("Sorry, `{0}` is disabled! Please contact a server admin for assistance.")
class Disable(commands.Cog):
"""
Quickly disable all commands in a guild.
"""
def __init__(self, bot):
self.config = Config.get_conf(self, identifier=768437593, force_registration=True)
self.config.register_guild(disabled_message=DEFAULT_MSG, disabled=False)
self.bot = bot
self.bot.before_invoke(self.disabler)
def cog_unload(self):
self.bot.remove_before_invoke_hook(self.disabler)
async def disabler(self, ctx):
if isinstance(ctx.channel, discord.DMChannel):
return
if await self.config.guild(ctx.guild).disabled() and not await is_admin_or_superior(self.bot, ctx.author):
raise DisabledError(f"Command {ctx.command.name} is disabled in {ctx.guild.name}.")
@commands.group(name="disable")
@commands.guild_only()
@checks.admin()
async def disable(self, ctx):
"""
Disable all commands for a bot.
Only admins can use commands when commands are disabled in the server.
"""
pass
@disable.command(name="toggle")
async def disable_toggle(self, ctx):
"""
Toggles disabled state of commands.
"""
current = await self.config.guild(ctx.guild).disabled()
current = current != True
await self.config.guild(ctx.guild).disabled.set(current)
await ctx.tick()
@disable.command(name="message")
async def disable_message(self, ctx, *, msg: str = None):
"""
Change default error message.
Use {0} to get name of command.
Pass no message to see current message.
"""
if not msg:
current = await self.config.guild(ctx.guild).disabled_message()
await ctx.send(current)
return
await self.config.guild(ctx.guild).disabled_message.set(msg)
await ctx.tick()
@commands.Cog.listener()
async def on_command_error(self, ctx, exception):
if await self.bot.cog_disabled_in_guild(self, ctx.guild):
return
if isinstance(exception, DisabledError):
msg = await self.config.guild(ctx.guild).disabled_message()
await ctx.send(msg.format(ctx.command.name))
async def red_delete_data_for_user(
self,
*,
requester: Literal["discord_deleted_user", "owner", "user", "user_strict"],
user_id: int,
):
pass