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
Remember to use double quotes."""
if number < 1:
number = 1
author = ctx.message.author
message = ctx.message
cmdmsg = message
logger.info("{}({}) deleted {} messages containing '{}' in channel {}".format(
author.name, author.id, str(number), text, message.channel.name))
channel = ctx.message.channel
logger.info("{}({}) deleted {} messages containing '{}' in channel {}".format(author.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:
if number > 0 and number < 10000:
while True:
@ -144,7 +166,8 @@ class Mod:
await asyncio.sleep(0.25)
break
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)
async def user(self, ctx, user: discord.Member, number: int):
@ -153,11 +176,34 @@ class Mod:
Examples:
cleanup user @\u200bTwentysix 2
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
message = ctx.message
cmdmsg = message
logger.info("{}({}) deleted {} messages made by {}({}) in channel {}".format(
author.name, author.id, str(number), user.name, user.id, message.channel.name))
cmdmsg = ctx.message
if self.bot.user.bot:
print("Your discord.py is outdated, defaulting to slow deletion.")
try:
if number > 0 and number < 10000:
while True:
@ -178,7 +224,9 @@ class Mod:
await asyncio.sleep(0.25)
break
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)
async def messages(self, ctx, number: int):
@ -186,17 +234,32 @@ class Mod:
Example:
cleanup messages 26"""
if number < 1:
number = 1
author = ctx.message.author
channel = ctx.message.channel
logger.info("{}({}) deleted {} messages in channel {}".format(
author.name, author.id, str(number), channel.name))
logger.info("{}({}) deleted {} messages in channel {}".format(author.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:
if number > 0 and number < 10000:
async for x in self.bot.logs_from(channel, limit=number + 1):
await self._delete_message(x)
await asyncio.sleep(0.25)
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)
@checks.is_owner()
@ -480,6 +543,13 @@ class Mod:
else:
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):
try:
await self.bot.delete_message(message)
@ -509,8 +579,8 @@ class Mod:
server = message.server
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 self.immune_from_filter(message) or not can_delete:
if (message.author.id == self.bot.user.id or
self.immune_from_filter(message) or not can_delete): # Owner, admins and mods are immune to the filter
return
if server.id in self.filter.keys():
@ -583,4 +653,4 @@ def setup(bot):
n = Mod(bot)
bot.add_listener(n.check_filter, "on_message")
bot.add_listener(n.check_names, "on_member_update")
bot.add_cog(n)
bot.add_cog(n)