196 lines
8.3 KiB
Python
196 lines
8.3 KiB
Python
import datetime
|
|
import typing
|
|
|
|
import discord
|
|
from redbot.core import Config, commands
|
|
from redbot.core.bot import Red
|
|
from redbot.core.utils.chat_formatting import humanize_list
|
|
|
|
|
|
class Lock(commands.Cog):
|
|
"""
|
|
Lock `@everyone` from sending messages in channels or the entire guild, and only allow Moderators to talk.
|
|
"""
|
|
|
|
__version__ = "2.0.1"
|
|
__author__ = "saurichable, Kreusada"
|
|
|
|
def __init__(self, bot: Red):
|
|
self.bot = bot
|
|
self.config = Config.get_conf(self, identifier=36546565165464, force_registration=True)
|
|
|
|
self.config.register_guild(moderator=None, everyone=True, ignore=[])
|
|
|
|
async def red_delete_data_for_user(self, *, requester, user_id):
|
|
# nothing to delete
|
|
return
|
|
|
|
def format_help_for_context(self, ctx: commands.Context) -> str:
|
|
context = super().format_help_for_context(ctx)
|
|
return f"{context}\n\nVersion: {self.__version__}\nAuthors : {self.__author__}"
|
|
|
|
@commands.group(autohelp=True)
|
|
@commands.guild_only()
|
|
@commands.admin()
|
|
async def lockset(self, ctx: commands.Context):
|
|
"""Various Lock settings."""
|
|
|
|
@lockset.command(name="role")
|
|
async def lockset_role(self, ctx: commands.Context, role: discord.Role):
|
|
"""Set role that can lock channels."""
|
|
await self.config.guild(ctx.guild).moderator.set(role.id)
|
|
await ctx.tick()
|
|
|
|
@lockset.command(name="perms")
|
|
async def lockset_perms(self, ctx: commands.Context, everyone: bool):
|
|
"""Set if you use roles to access channels."""
|
|
await self.config.guild(ctx.guild).everyone.set(not everyone)
|
|
await ctx.tick()
|
|
|
|
@lockset.command(name="ignore")
|
|
async def lockset_ignore(self, ctx: commands.Context, channel: discord.TextChannel):
|
|
"""Ignore a channel during server lock."""
|
|
if channel.id not in await self.config.guild(ctx.guild).ignore():
|
|
async with self.config.guild(ctx.guild).ignore() as ignore:
|
|
ignore.append(channel.id)
|
|
return await ctx.send(
|
|
f"{channel.mention} has been added into the ignored channels list."
|
|
)
|
|
await ctx.send(f"{channel.mention} is already in the ignored channels list.")
|
|
|
|
@lockset.command(name="unignore")
|
|
async def lockset_unignore(self, ctx: commands.Context, channel: discord.TextChannel):
|
|
"""Remove channels from the ignored list."""
|
|
if channel.id not in await self.config.guild(ctx.guild).ignore():
|
|
return await ctx.send(f"{channel.mention} already isn't in the ignored channels list.")
|
|
async with self.config.guild(ctx.guild).ignore() as ignore:
|
|
ignore.remove(channel.id)
|
|
await ctx.send(f"{channel.mention} has been removed from the ignored channels list.")
|
|
|
|
@lockset.command(name="settings")
|
|
async def lockset_settings(self, ctx: commands.Context):
|
|
"""See current settings."""
|
|
data = await self.config.guild(ctx.guild).all()
|
|
mods = ctx.guild.get_role(data["moderator"])
|
|
mods = "None" if not mods else mods.name
|
|
|
|
channels = data["ignore"]
|
|
c_text = list()
|
|
if channels == []:
|
|
c_text = "None"
|
|
else:
|
|
for channel in channels:
|
|
c = ctx.guild.get_channel(channel)
|
|
if c:
|
|
c_text.append(c.mention)
|
|
c_text = humanize_list(c_text)
|
|
|
|
embed = discord.Embed(colour=await ctx.embed_colour(), timestamp=datetime.datetime.now())
|
|
embed.set_author(name=ctx.guild.name, icon_url=ctx.guild.icon.url if ctx.guild.icon else None)
|
|
embed.title = "**__Lock settings:__**"
|
|
embed.set_footer(text="*required to function properly")
|
|
|
|
embed.add_field(name="Role that can type after locking*:", value=mods, inline=False)
|
|
embed.add_field(
|
|
name="Using roles to access servers:*:",
|
|
value=str(not data["everyone"]),
|
|
inline=False,
|
|
)
|
|
embed.add_field(name="Ignored channels:", value=c_text, inline=False)
|
|
|
|
await ctx.send(embed=embed)
|
|
|
|
@commands.mod()
|
|
@commands.bot_has_permissions(manage_channels=True)
|
|
@commands.guild_only()
|
|
@commands.group(invoke_without_command=True)
|
|
async def lock(self, ctx: commands.Context):
|
|
"""Lock `@everyone` from sending messages."""
|
|
mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator())
|
|
which = await self.config.guild(ctx.guild).everyone()
|
|
|
|
if not mods:
|
|
return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.")
|
|
if which:
|
|
await ctx.channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=True, send_messages=False
|
|
)
|
|
else:
|
|
await ctx.channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=False, send_messages=False
|
|
)
|
|
await ctx.channel.set_permissions(mods, read_messages=True, send_messages=True)
|
|
await ctx.send(":lock: Channel locked. Only Moderators can type.")
|
|
|
|
@lock.command(name="server")
|
|
async def lock_server(self, ctx: commands.Context, confirmation: typing.Optional[bool]):
|
|
"""Lock `@everyone` from sending messages in the entire server."""
|
|
if not confirmation:
|
|
return await ctx.send(
|
|
"This will overwrite every channel's permissions.\n"
|
|
f"If you're sure, type `{ctx.clean_prefix}lockserver yes` (you can set an alias for this so I don't ask you every time)."
|
|
)
|
|
async with ctx.typing():
|
|
mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator())
|
|
which = await self.config.guild(ctx.guild).everyone()
|
|
ignore = await self.config.guild(ctx.guild).ignore()
|
|
|
|
if not mods:
|
|
return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.")
|
|
for channel in ctx.guild.text_channels:
|
|
if channel.id in ignore:
|
|
continue
|
|
if which:
|
|
await channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=True, send_messages=False
|
|
)
|
|
else:
|
|
await channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=False, send_messages=False
|
|
)
|
|
await channel.set_permissions(mods, read_messages=True, send_messages=True)
|
|
await ctx.send(":lock: Server locked. Only Moderators can type.")
|
|
|
|
@commands.mod()
|
|
@commands.bot_has_permissions(manage_channels=True)
|
|
@commands.guild_only()
|
|
@commands.group(invoke_without_command=True)
|
|
async def unlock(self, ctx: commands.Context):
|
|
"""Unlock the channel for `@everyone`."""
|
|
mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator())
|
|
which = await self.config.guild(ctx.guild).everyone()
|
|
|
|
if not mods:
|
|
return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.")
|
|
if which:
|
|
await ctx.channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=True, send_messages=True
|
|
)
|
|
else:
|
|
await ctx.channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=False, send_messages=True
|
|
)
|
|
await ctx.send(":unlock: Channel unlocked.")
|
|
|
|
@unlock.command(name="server")
|
|
async def unlock_server(self, ctx: commands.Context):
|
|
"""Unlock the entire server for `@everyone`"""
|
|
async with ctx.typing():
|
|
mods = ctx.guild.get_role(await self.config.guild(ctx.guild).moderator())
|
|
which = await self.config.guild(ctx.guild).everyone()
|
|
ignore = await self.config.guild(ctx.guild).ignore()
|
|
|
|
if not mods:
|
|
return await ctx.send("Uh oh. Looks like your Admins haven't setup this yet.")
|
|
for channel in ctx.guild.text_channels:
|
|
if channel.id in ignore:
|
|
continue
|
|
if which:
|
|
await channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=True, send_messages=True
|
|
)
|
|
else:
|
|
await channel.set_permissions(
|
|
ctx.guild.default_role, read_messages=False, send_messages=True
|
|
)
|
|
await ctx.send(":unlock: Server unlocked.")
|