def command_sql_reactions(self, event, message): try: message = Message.get(id=message) except Message.DoesNotExist: return event.msg.reply(':warning: no message found') message = self.state.channels.get(message.channel_id).get_message(message.id) for reaction in message.reactions: for users in message.get_reactors(reaction.emoji, bulk=True): Reaction.from_disco_reactors(message.id, reaction, (i.id for i in users))
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 on_message_reaction_remove_all(self, event): Reaction.delete().where((Reaction.message_id == event.message_id)).execute()
def on_message_reaction_remove(self, event): Reaction.delete().where( (Reaction.message_id == event.message_id) & (Reaction.user_id == event.user_id) & (Reaction.emoji_id == (event.emoji.id or None)) & (Reaction.emoji_name == (event.emoji.name or None))).execute()
def on_message_reaction_add(self, event): Reaction.from_disco_reaction(event)
def msgstats(self, event, user): # Query for the basic aggregate message statistics message_stats = Message.select( fn.Count('*'), fn.Sum(fn.char_length(Message.content)), fn.Sum(fn.array_length(Message.emojis, 1)), fn.Sum(fn.array_length(Message.mentions, 1)), fn.Sum(fn.array_length(Message.attachments, 1)), ).where( (Message.author_id == user.id) ).tuples().async() reactions_given = Reaction.select( fn.Count('*'), Reaction.emoji_id, Reaction.emoji_name, ).join( Message, on=(Message.id == Reaction.message_id) ).where( (Reaction.user_id == user.id) ).group_by( Reaction.emoji_id, Reaction.emoji_name ).order_by(fn.Count('*').desc()).tuples().async() # Query for most used emoji emojis = Message.raw(''' SELECT gm.emoji_id, gm.name, count(*) FROM ( SELECT unnest(emojis) as id FROM messages WHERE author_id=%s ) q JOIN guild_emojis gm ON gm.emoji_id=q.id GROUP BY 1, 2 ORDER BY 3 DESC LIMIT 1 ''', (user.id, )).tuples().async() deleted = Message.select( fn.Count('*') ).where( (Message.author_id == user.id) & (Message.deleted == 1) ).tuples().async() wait_many(message_stats, reactions_given, emojis, deleted, timeout=10) # If we hit an exception executing the core query, throw an exception if message_stats.exception: message_stats.get() q = message_stats.value[0] embed = MessageEmbed() embed.fields.append( MessageEmbedField(name='Total Messages Sent', value=q[0] or '0', inline=True)) embed.fields.append( MessageEmbedField(name='Total Characters Sent', value=q[1] or '0', inline=True)) if deleted.value: embed.fields.append( MessageEmbedField(name='Total Deleted Messages', value=deleted.value[0][0], inline=True)) embed.fields.append( MessageEmbedField(name='Total Custom Emojis', value=q[2] or '0', inline=True)) embed.fields.append( MessageEmbedField(name='Total Mentions', value=q[3] or '0', inline=True)) embed.fields.append( MessageEmbedField(name='Total Attachments', value=q[4] or '0', inline=True)) if reactions_given.value: reactions_given = reactions_given.value embed.fields.append( MessageEmbedField(name='Total Reactions', value=sum(i[0] for i in reactions_given), inline=True)) emoji = ( reactions_given[0][2] if not reactions_given[0][1] else '<:{}:{}>'.format(reactions_given[0][2], reactions_given[0][1]) ) embed.fields.append( MessageEmbedField(name='Most Used Reaction', value=u'{} (used {} times)'.format( emoji, reactions_given[0][0], ), inline=True)) if emojis.value: emojis = list(emojis.value) if emojis: embed.add_field( name='Most Used Emoji', value=u'<:{1}:{0}> (`{1}`, used {2} times)'.format(*emojis[0])) embed.thumbnail = MessageEmbedThumbnail(url=user.avatar_url) embed.color = get_dominant_colors_user(user) event.msg.reply('', embed=embed)