225 lines
8.8 KiB
Python
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))
|