def clean(self, event, user=None, size=25, typ=None, mode='all'): """ Removes messages """ if 0 > size >= 10000: raise CommandFail('too many messages must be between 1-10000') lock = rdb.lock('clean-{}'.format(event.channel.id)) if not lock.acquire(blocking=False): raise CommandFail('already running a clean on this channel') try: query = Message.select().where( (Message.deleted >> False) & (Message.channel_id == event.channel.id) & (Message.timestamp > (datetime.utcnow() - timedelta(days=13)) )).join(User).order_by(Message.timestamp.desc()).limit(size) if mode == 'bots': query = query.where((User.bot >> True)) elif mode == 'user': query = query.where((User.user_id == user.id)) msgs = list(reversed(query)) event.channel.delete_messages(msgs) event.msg.reply(':wastebasket: Ok, deleted {} messages'.format( len(msgs))).after(5).delete() finally: lock.release()
def reactions_clean(self, event, user, count=10, emoji=None): if isinstance(user, DiscoUser): user = user.id if count > 50: raise CommandFail('cannot clean more than 50 reactions') lock = rdb.lock('clean-reactions-{}'.format(user)) if not lock.acquire(blocking=False): raise CommandFail('already running a clean on user') query = [ (Reaction.user_id == user), (Message.guild_id == event.guild.id), (Message.deleted == 0), ] if emoji: emoji_id = EMOJI_RE.findall(emoji) if emoji_id: query.append((Reaction.emoji_id == emoji_id[0])) else: # TODO: validation? query.append((Reaction.emoji_name == emoji)) try: reactions = list( Reaction.select( Reaction.message_id, Reaction.emoji_id, Reaction.emoji_name, Message.channel_id, ).join( Message, on=(Message.id == Reaction.message_id), ).where(reduce(operator.and_, query)).order_by( Reaction.message_id.desc()).limit(count).tuples()) if not reactions: raise CommandFail('no reactions to purge') msg = event.msg.reply('Hold on while I clean {} reactions'.format( len(reactions))) for message_id, emoji_id, emoji_name, channel_id in reactions: if emoji_id: emoji = '{}:{}'.format(emoji_name, emoji_id) else: emoji = emoji_name self.client.api.channels_messages_reactions_delete( channel_id, message_id, emoji, user) msg.edit('Ok, I cleaned {} reactions'.format(len(reactions), )) finally: lock.release()
def run(self, job): lock = None if self.task.global_lock: lock = rdb.lock('{}:{}'.format( self.task.name, self.task.global_lock(*job['args'], **job['kwargs']))) lock.acquire() if self.task.max_concurrent: self.lock.acquire() self.process(job) if lock: lock.release() if self.task.max_concurrent: self.lock.release()