fd845ecb40
FORK MAINTAINERS: I'm so, so sorry, but this was planned since forever. If you need help integrating this, feel free to contact me.
99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
from discord.ext import commands
|
|
from discord.ext.commands import Cog
|
|
import config
|
|
import discord
|
|
from helpers.checks import check_if_staff
|
|
|
|
|
|
class Lockdown(Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
async def set_sendmessage(
|
|
self, channel: discord.TextChannel, role, allow_send, issuer
|
|
):
|
|
try:
|
|
roleobj = channel.guild.get_role(role)
|
|
overrides = channel.overwrites_for(roleobj)
|
|
overrides.send_messages = allow_send
|
|
await channel.set_permissions(
|
|
roleobj, overwrite=overrides, reason=str(issuer)
|
|
)
|
|
except:
|
|
pass
|
|
|
|
async def unlock_for_staff(self, channel: discord.TextChannel, issuer):
|
|
for role in config.staff_role_ids:
|
|
await self.set_sendmessage(channel, role, True, issuer)
|
|
|
|
@commands.guild_only()
|
|
@commands.check(check_if_staff)
|
|
@commands.command()
|
|
async def lock(self, ctx, channel: discord.TextChannel = None, soft: bool = False):
|
|
"""Prevents people from speaking in a channel, staff only.
|
|
|
|
Defaults to current channel."""
|
|
if not channel:
|
|
channel = ctx.channel
|
|
log_channel = self.bot.get_channel(config.modlog_channel)
|
|
|
|
for key, lockdown_conf in config.lockdown_configs.items():
|
|
if channel.id in lockdown_conf["channels"]:
|
|
roles = lockdown_conf["roles"]
|
|
|
|
if roles is None:
|
|
roles = config.lockdown_configs["default"]["roles"]
|
|
|
|
for role in roles:
|
|
await self.set_sendmessage(channel, role, False, ctx.author)
|
|
|
|
await self.unlock_for_staff(channel, ctx.author)
|
|
|
|
public_msg = "🔒 Channel locked down. "
|
|
if not soft:
|
|
public_msg += (
|
|
"Only staff members may speak. "
|
|
"Do not bring the topic to other channels or risk "
|
|
"disciplinary actions."
|
|
)
|
|
|
|
await ctx.send(public_msg)
|
|
safe_name = await commands.clean_content().convert(ctx, str(ctx.author))
|
|
msg = (
|
|
f"🔒 **Lockdown**: {ctx.channel.mention} by {ctx.author.mention} "
|
|
f"| {safe_name}"
|
|
)
|
|
await log_channel.send(msg)
|
|
|
|
@commands.guild_only()
|
|
@commands.check(check_if_staff)
|
|
@commands.command()
|
|
async def unlock(self, ctx, channel: discord.TextChannel = None):
|
|
"""Unlocks speaking in current channel, staff only."""
|
|
if not channel:
|
|
channel = ctx.channel
|
|
log_channel = self.bot.get_channel(config.modlog_channel)
|
|
|
|
for key, lockdown_conf in config.lockdown_configs.items():
|
|
if channel.id in lockdown_conf["channels"]:
|
|
roles = lockdown_conf["roles"]
|
|
|
|
if roles is None:
|
|
roles = config.lockdown_configs["default"]["roles"]
|
|
|
|
await self.unlock_for_staff(channel, ctx.author)
|
|
|
|
for role in roles:
|
|
await self.set_sendmessage(channel, role, True, ctx.author)
|
|
|
|
safe_name = await commands.clean_content().convert(ctx, str(ctx.author))
|
|
await ctx.send("🔓 Channel unlocked.")
|
|
msg = (
|
|
f"🔓 **Unlock**: {ctx.channel.mention} by {ctx.author.mention} "
|
|
f"| {safe_name}"
|
|
)
|
|
await log_channel.send(msg)
|
|
|
|
|
|
def setup(bot):
|
|
bot.add_cog(Lockdown(bot))
|