Files
Mace-AIO-Discord-Bot---With…/bot/cogs/moderation/mod_hub.py

225 lines
8.8 KiB
Python

# ╔══════════════════════════════════════════════════════════════════╗
# ║ ║
# ║ +-+-+-+-+-+-+-+-+ ║
# ║ |H|e|x|a|H|o|s|t| ║
# ║ +-+-+-+-+-+-+-+-+ ║
# ║ ║
# ║ © 2026 HexaHost — All Rights Reserved ║
# ║ ║
# ║ discord ── https://discord.gg/hexahost ║
# ║ github ── https://github.com/theoneandonlymace ║
# ║ ║
# ╚══════════════════════════════════════════════════════════════════╝
from __future__ import annotations
import discord
from discord.ext import commands
class ModHub(commands.Cog):
"""Slash/prefix hub that exposes moderation actions under `/mod <subcommand>`."""
def __init__(self, bot):
self.bot = bot
async def _get_cog(self, ctx: commands.Context, name: str):
cog = self.bot.get_cog(name)
if not cog:
await ctx.send(f"{name} module unavailable.")
return None
return cog
@commands.hybrid_group(
name="mod",
description="Moderation commands",
fallback="help",
invoke_without_command=True,
)
@commands.guild_only()
async def mod(self, ctx: commands.Context):
"""Moderation root — use `/mod <subcommand>` or `>mod <subcommand>`."""
if ctx.subcommand_passed is None:
await ctx.send_help(ctx.command)
@mod.command(name="ban", description="Ban a user")
@commands.has_permissions(ban_members=True)
@commands.bot_has_permissions(ban_members=True)
@commands.guild_only()
async def mod_ban(self, ctx: commands.Context, user: discord.User, *, reason: str = None):
cog = await self._get_cog(ctx, "Ban")
if not cog:
return
await cog.ban(ctx, user, reason=reason)
@mod.command(name="unban", description="Unban a user")
@commands.has_permissions(ban_members=True)
@commands.bot_has_permissions(ban_members=True)
@commands.guild_only()
async def mod_unban(self, ctx: commands.Context, user: discord.User, *, reason: str = None):
cog = await self._get_cog(ctx, "Unban")
if not cog:
return
await cog.unban(ctx, user, reason=reason)
@mod.command(name="kick", description="Kick a member")
@commands.has_permissions(kick_members=True)
@commands.bot_has_permissions(kick_members=True)
@commands.guild_only()
async def mod_kick(self, ctx: commands.Context, member: discord.Member, *, reason: str = None):
cog = await self._get_cog(ctx, "Kick")
if not cog:
return
await cog.kick_command(ctx, member, reason=reason)
@mod.command(name="mute", description="Mute / timeout a member")
@commands.has_permissions(moderate_members=True)
@commands.bot_has_permissions(moderate_members=True)
@commands.guild_only()
async def mod_mute(
self,
ctx: commands.Context,
user: discord.Member,
time: str = None,
*,
reason: str = None,
):
cog = await self._get_cog(ctx, "Mute")
if not cog:
return
await cog.mute(ctx, user, time, reason=reason)
@mod.command(name="unmute", description="Remove a timeout from a member")
@commands.has_permissions(moderate_members=True)
@commands.bot_has_permissions(moderate_members=True)
@commands.guild_only()
async def mod_unmute(self, ctx: commands.Context, user: discord.Member):
cog = await self._get_cog(ctx, "Unmute")
if not cog:
return
await cog.unmute(ctx, user)
@mod.command(name="warn", description="Warn a member")
@commands.has_permissions(moderate_members=True)
@commands.guild_only()
async def mod_warn(self, ctx: commands.Context, user: discord.Member, *, reason: str = None):
cog = await self._get_cog(ctx, "Warn")
if not cog:
return
await cog.warn(ctx, user, reason=reason)
@mod.command(name="clearwarns", description="Clear warnings for a member")
@commands.has_permissions(moderate_members=True)
@commands.guild_only()
async def mod_clearwarns(self, ctx: commands.Context, user: discord.Member):
cog = await self._get_cog(ctx, "Warn")
if not cog:
return
await cog.clearwarns(ctx, user)
@mod.command(name="lock", description="Lock a channel")
@commands.has_permissions(manage_channels=True)
@commands.bot_has_permissions(manage_channels=True)
@commands.guild_only()
async def mod_lock(self, ctx: commands.Context, channel: discord.TextChannel = None):
cog = await self._get_cog(ctx, "Lock")
if not cog:
return
await cog.lock_command(ctx, channel)
@mod.command(name="unlock", description="Unlock a channel")
@commands.has_permissions(manage_roles=True)
@commands.bot_has_permissions(manage_roles=True)
@commands.guild_only()
async def mod_unlock(self, ctx: commands.Context, channel: discord.TextChannel = None):
cog = await self._get_cog(ctx, "Unlock")
if not cog:
return
await cog.unlock_command(ctx, channel)
@mod.command(name="hide", description="Hide a channel")
@commands.has_permissions(manage_channels=True)
@commands.bot_has_permissions(manage_channels=True)
@commands.guild_only()
async def mod_hide(self, ctx: commands.Context, channel: discord.TextChannel = None):
cog = await self._get_cog(ctx, "Hide")
if not cog:
return
await cog.hide_command(ctx, channel)
@mod.command(name="unhide", description="Unhide a channel")
@commands.has_permissions(manage_channels=True)
@commands.bot_has_permissions(manage_channels=True)
@commands.guild_only()
async def mod_unhide(self, ctx: commands.Context, channel: discord.TextChannel = None):
cog = await self._get_cog(ctx, "Unhide")
if not cog:
return
await cog.unhide_command(ctx, channel)
@mod.command(name="lockall", description="Lock all channels")
@commands.has_permissions(administrator=True)
@commands.guild_only()
async def mod_lockall(self, ctx: commands.Context):
cog = await self._get_cog(ctx, "Moderation")
if not cog:
return
await cog.lockall(ctx)
@mod.command(name="unlockall", description="Unlock all channels")
@commands.has_permissions(administrator=True)
@commands.guild_only()
async def mod_unlockall(self, ctx: commands.Context):
cog = await self._get_cog(ctx, "Moderation")
if not cog:
return
await cog.unlockall(ctx)
@mod.command(name="nuke", description="Nuke the current channel")
@commands.has_permissions(manage_channels=True)
@commands.guild_only()
async def mod_nuke(self, ctx: commands.Context):
cog = await self._get_cog(ctx, "Moderation")
if not cog:
return
await cog._nuke(ctx)
@mod.command(name="slowmode", description="Set channel slowmode")
@commands.has_permissions(manage_messages=True)
@commands.guild_only()
async def mod_slowmode(self, ctx: commands.Context, seconds: int = 0):
cog = await self._get_cog(ctx, "Moderation")
if not cog:
return
await cog._slowmode(ctx, seconds)
@mod.command(name="nick", description="Change a member's nickname")
@commands.has_permissions(manage_nicknames=True)
@commands.bot_has_permissions(manage_nicknames=True)
@commands.guild_only()
async def mod_nick(
self,
ctx: commands.Context,
member: discord.Member,
*,
name: str = None,
):
cog = await self._get_cog(ctx, "Moderation")
if not cog:
return
await cog.changenickname(ctx, member, name=name)
@mod.command(name="audit", description="View recent audit log entries")
@commands.has_permissions(view_audit_log=True)
@commands.bot_has_permissions(view_audit_log=True)
@commands.guild_only()
async def mod_audit(self, ctx: commands.Context, limit: int):
cog = await self._get_cog(ctx, "Moderation")
if not cog:
return
await cog.auditlog(ctx, limit)
async def setup(bot):
await bot.add_cog(ModHub(bot))