[V3 Dungeon] Add autoban
Autoban with DM message if chosen, setting to use mod-log for banning
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import asyncio
|
||||
import datetime
|
||||
import discord
|
||||
from redbot.core import Config, commands, checks
|
||||
from redbot.core import Config, commands, checks, modlog
|
||||
from redbot.core.data_manager import cog_data_path
|
||||
|
||||
|
||||
@@ -14,12 +14,15 @@ class Dungeon:
|
||||
|
||||
default_guild = {
|
||||
"announce_channel": None,
|
||||
"auto_ban": False,
|
||||
"auto_ban_message": None,
|
||||
"auto_blacklist": False,
|
||||
"dm_message": None,
|
||||
"dm_toggle": False,
|
||||
"dungeon_channel": None,
|
||||
"dungeon_role": None,
|
||||
"join_days": 7,
|
||||
"mod_log": False,
|
||||
"profile_toggle": False,
|
||||
"toggle": False,
|
||||
"user_role": None,
|
||||
@@ -81,6 +84,26 @@ class Dungeon:
|
||||
f"User announcement channel set to: {self.bot.get_channel(announce_channel_id).mention}."
|
||||
)
|
||||
|
||||
@dungeon.command()
|
||||
async def autoban(self, ctx):
|
||||
"""Toggle auto-banning users instead of sending them to the dungeon."""
|
||||
auto_ban = await self.config.guild(ctx.guild).auto_ban()
|
||||
await self.config.guild(ctx.guild).auto_ban.set(not auto_ban)
|
||||
await ctx.send(f"Auto-ban instead of sending to the dungeon: {not auto_ban}.")
|
||||
|
||||
@dungeon.command()
|
||||
async def banmessage(self, ctx, *, ban_message=None):
|
||||
"""Set the message to send on an autoban. If message is left blank, no message will be sent."""
|
||||
auto_ban = await self.config.guild(ctx.guild).auto_ban()
|
||||
if not ban_message:
|
||||
await self.config.guild(ctx.guild).auto_ban_message.set(None)
|
||||
return await ctx.send(
|
||||
"Auto-ban message removed. No message will be sent on an auto-ban."
|
||||
)
|
||||
await self.config.guild(ctx.guild).auto_ban_message.set(str(ban_message))
|
||||
await self.config.guild(ctx.guild).auto_ban.set(True)
|
||||
await ctx.send(f"Auto-ban has been turned on.\nMessage to send on ban:\n{ban_message}")
|
||||
|
||||
@dungeon.command()
|
||||
async def blacklist(self, ctx):
|
||||
"""Toggle auto-blacklisting for the bot for users moved to the dungeon."""
|
||||
@@ -115,6 +138,14 @@ class Dungeon:
|
||||
f"Users must have accounts older than {days} day(s) to be awarded the member role instead of the dungeon role on join."
|
||||
)
|
||||
|
||||
@dungeon.command()
|
||||
async def modlog(self, ctx):
|
||||
"""Toggle using the Red mod-log for auto-bans.
|
||||
The mod-log has to be configured to display bans for this to work."""
|
||||
mod_log = await self.config.guild(ctx.guild).mod_log()
|
||||
await self.config.guild(ctx.guild).mod_log.set(not mod_log)
|
||||
await ctx.send(f"Mod-log entry on auto-ban: {not mod_log}.")
|
||||
|
||||
@dungeon.command()
|
||||
async def role(self, ctx, role_name: discord.Role):
|
||||
"""Sets the role to use for the dungeon."""
|
||||
@@ -283,6 +314,12 @@ class Dungeon:
|
||||
auto_blacklist = data["auto_blacklist"]
|
||||
profile_toggle = data["profile_toggle"]
|
||||
dm_toggle = data["dm_toggle"]
|
||||
auto_ban = data["auto_ban"]
|
||||
ban_msg = data["auto_ban_message"]
|
||||
mod_log = data["mod_log"]
|
||||
|
||||
if ban_msg:
|
||||
ban_msg = "True"
|
||||
|
||||
msg = (
|
||||
"```ini\n----Dungeon Settings----\n"
|
||||
@@ -294,7 +331,11 @@ class Dungeon:
|
||||
f"Autorole Role: [{urole}]\n"
|
||||
f"Auto-blacklist: [{auto_blacklist}]\n"
|
||||
f"Default PFP Flag: [{profile_toggle}]\n"
|
||||
f"Msg on Verify: [{dm_toggle}]\n```"
|
||||
f"Day Threshold: [{str(join_days)}]\n"
|
||||
f"Msg on Verify: [{dm_toggle}]\n"
|
||||
f"Auto-ban: [{auto_ban}]\n"
|
||||
f"Ban Message: [{ban_msg}]\n"
|
||||
f"Mod-log on Ban: [{mod_log}]\n```"
|
||||
)
|
||||
|
||||
embed = discord.Embed(colour=ctx.guild.me.top_role.colour, description=msg)
|
||||
@@ -314,11 +355,66 @@ class Dungeon:
|
||||
profile_toggle = await self.config.guild(member.guild).profile_toggle()
|
||||
announce_channel = await self.config.guild(member.guild).announce_channel()
|
||||
channel_object = self.bot.get_channel(announce_channel)
|
||||
auto_ban = await self.config.guild(member.guild).auto_ban()
|
||||
auto_ban_msg = await self.config.guild(member.guild).auto_ban_message()
|
||||
mod_log = await self.config.guild(member.guild).mod_log()
|
||||
|
||||
if (since_join.days < join_days) or (profile_toggle and default_avatar):
|
||||
blacklist = await self.config.guild(member.guild).auto_blacklist()
|
||||
dungeon_role_id = await self.config.guild(member.guild).dungeon_role()
|
||||
dungeon_role_obj = discord.utils.get(member.guild.roles, id=dungeon_role_id)
|
||||
perm_msg = f"dungeon.py: Unable to auto-ban user, permissions needed and no announce channel set. Guild: {member.guild.id}"
|
||||
|
||||
if auto_ban:
|
||||
if auto_ban_msg:
|
||||
try:
|
||||
await member.send(auto_ban_msg)
|
||||
except discord.Forbidden:
|
||||
if announce_channel:
|
||||
return await channel_object.send(
|
||||
f"I couldn't DM {user} to let them know they've been banned, they've blocked me."
|
||||
)
|
||||
else:
|
||||
print(perm_msg)
|
||||
return
|
||||
try:
|
||||
await member.guild.ban(
|
||||
member, reason="Dungeon auto-ban", delete_message_days=0
|
||||
)
|
||||
except discord.Forbidden:
|
||||
if announce_channel:
|
||||
return await channel_object.send(
|
||||
"I tried to auto-ban someone ({member}, {member.id}) but I don't have ban permissions."
|
||||
)
|
||||
else:
|
||||
print(perm_msg)
|
||||
return
|
||||
|
||||
if not mod_log:
|
||||
if announce_channel:
|
||||
msg = f"Auto-banned new user: \n**{member}** ({member.id})\n{self._dynamic_time(int(since_join.total_seconds()))} old account"
|
||||
return await channel_object.send(msg)
|
||||
else:
|
||||
print(perm_msg)
|
||||
return
|
||||
else:
|
||||
try:
|
||||
await modlog.create_case(
|
||||
self.bot,
|
||||
member.guild,
|
||||
now,
|
||||
"ban",
|
||||
member,
|
||||
member.guild.me,
|
||||
reason,
|
||||
until=None,
|
||||
channel=None,
|
||||
)
|
||||
except RuntimeError as e:
|
||||
print(
|
||||
f"dungeon.py error while autobanning user and attempting to create modlog entry: {e}\nIn guild: {member.guild.id}"
|
||||
)
|
||||
|
||||
if blacklist:
|
||||
async with self.bot.db.blacklist() as blacklist_list:
|
||||
if member.id not in blacklist_list:
|
||||
|
||||
Reference in New Issue
Block a user