Mass deletion support for cleanup (#254)

Defaults to slow deletion if not bot account
This commit is contained in:
Twentysix 2016-05-13 22:56:59 +02:00
parent a1cc088b6a
commit 0bc7b41d8c

View File

@ -119,11 +119,33 @@ class Mod:
cleanup text \"test\" 5 cleanup text \"test\" 5
Remember to use double quotes.""" Remember to use double quotes."""
if number < 1:
number = 1
author = ctx.message.author author = ctx.message.author
message = ctx.message message = ctx.message
cmdmsg = message channel = ctx.message.channel
logger.info("{}({}) deleted {} messages containing '{}' in channel {}".format( logger.info("{}({}) deleted {} messages containing '{}' in channel {}".format(author.name,
author.name, author.id, str(number), text, message.channel.name)) author.id, str(number), text, message.channel.name))
if self.bot.user.bot and self.discordpy_updated():
def to_delete(m):
if m == ctx.message or text in m.content:
return True
else:
return False
try:
await self.bot.purge_from(channel, limit=number+1, check=to_delete)
except discord.errors.Forbidden:
await self.bot.say("I need permissions to manage messages "
"in this channel.")
else:
await self.legacy_cleanup_text_messages(ctx, text, number)
async def legacy_cleanup_text_messages(self, ctx, text, number):
message = ctx.message
cmdmsg = ctx.message
if self.bot.user.bot:
print("Your discord.py is outdated, defaulting to slow deletion.")
try: try:
if number > 0 and number < 10000: if number > 0 and number < 10000:
while True: while True:
@ -144,7 +166,8 @@ class Mod:
await asyncio.sleep(0.25) await asyncio.sleep(0.25)
break break
except discord.errors.Forbidden: except discord.errors.Forbidden:
await self.bot.say("I need permissions to manage messages in this channel.") await self.bot.send_message(message.channel, "I need permissions"
" to manage messages in this channel.")
@cleanup.command(pass_context=True, no_pm=True) @cleanup.command(pass_context=True, no_pm=True)
async def user(self, ctx, user: discord.Member, number: int): async def user(self, ctx, user: discord.Member, number: int):
@ -153,11 +176,34 @@ class Mod:
Examples: Examples:
cleanup user @\u200bTwentysix 2 cleanup user @\u200bTwentysix 2
cleanup user Red 6""" cleanup user Red 6"""
if number < 1:
number = 1
author = ctx.message.author
channel = ctx.message.channel
message = ctx.message
logger.info("{}({}) deleted {} messages made by {}({}) in channel {}".format(author.name,
author.id, str(number), user.name, user.id, message.channel.name))
if self.bot.user.bot and self.discordpy_updated():
def is_user(m):
if m == ctx.message or m.author == user:
return True
else:
return False
try:
await self.bot.purge_from(channel, limit=number+1, check=is_user)
except discord.errors.Forbidden:
await self.bot.say("I need permissions to manage messages "
"in this channel.")
else:
await self.legacy_cleanup_user_messages(ctx, user, number)
async def legacy_cleanup_user_messages(self, ctx, user, number):
author = ctx.message.author author = ctx.message.author
message = ctx.message message = ctx.message
cmdmsg = message cmdmsg = ctx.message
logger.info("{}({}) deleted {} messages made by {}({}) in channel {}".format( if self.bot.user.bot:
author.name, author.id, str(number), user.name, user.id, message.channel.name)) print("Your discord.py is outdated, defaulting to slow deletion.")
try: try:
if number > 0 and number < 10000: if number > 0 and number < 10000:
while True: while True:
@ -178,7 +224,9 @@ class Mod:
await asyncio.sleep(0.25) await asyncio.sleep(0.25)
break break
except discord.errors.Forbidden: except discord.errors.Forbidden:
await self.bot.say("I need permissions to manage messages in this channel.") await self.bot.send_message(ctx.channel, "I need permissions "
"to manage messages in this channel.")
@cleanup.command(pass_context=True, no_pm=True) @cleanup.command(pass_context=True, no_pm=True)
async def messages(self, ctx, number: int): async def messages(self, ctx, number: int):
@ -186,17 +234,32 @@ class Mod:
Example: Example:
cleanup messages 26""" cleanup messages 26"""
if number < 1:
number = 1
author = ctx.message.author author = ctx.message.author
channel = ctx.message.channel channel = ctx.message.channel
logger.info("{}({}) deleted {} messages in channel {}".format( logger.info("{}({}) deleted {} messages in channel {}".format(author.name,
author.name, author.id, str(number), channel.name)) author.id, str(number), channel.name))
if self.bot.user.bot and self.discordpy_updated():
try:
await self.bot.purge_from(channel, limit=number+1)
except discord.errors.Forbidden:
await self.bot.say("I need permissions to manage messages in this channel.")
else:
await self.legacy_cleanup_messages(ctx, number)
async def legacy_cleanup_messages(self, ctx, number):
author = ctx.message.author
channel = ctx.message.channel
if self.bot.user.bot:
print("Your discord.py is outdated, defaulting to slow deletion.")
try: try:
if number > 0 and number < 10000: if number > 0 and number < 10000:
async for x in self.bot.logs_from(channel, limit=number + 1): async for x in self.bot.logs_from(channel, limit=number + 1):
await self._delete_message(x) await self._delete_message(x)
await asyncio.sleep(0.25) await asyncio.sleep(0.25)
except discord.errors.Forbidden: except discord.errors.Forbidden:
await self.bot.say("I need permissions to manage messages in this channel.") await self.bot.send_message(channel, "I need permissions to manage messages in this channel.")
@commands.group(pass_context=True) @commands.group(pass_context=True)
@checks.is_owner() @checks.is_owner()
@ -480,6 +543,13 @@ class Mod:
else: else:
await self.bot.say("That user doesn't have any recorded name change.") await self.bot.say("That user doesn't have any recorded name change.")
def discordpy_updated(self):
try:
assert self.bot.purge_from
except:
return False
return True
async def _delete_message(self, message): async def _delete_message(self, message):
try: try:
await self.bot.delete_message(message) await self.bot.delete_message(message)
@ -509,8 +579,8 @@ class Mod:
server = message.server server = message.server
can_delete = message.channel.permissions_for(server.me).manage_messages can_delete = message.channel.permissions_for(server.me).manage_messages
# Owner, admins and mods are immune to the filter if (message.author.id == self.bot.user.id or
if message.author.id == self.bot.user.id or self.immune_from_filter(message) or not can_delete: self.immune_from_filter(message) or not can_delete): # Owner, admins and mods are immune to the filter
return return
if server.id in self.filter.keys(): if server.id in self.filter.keys():