Exemplo n.º 1
0
 async def poll_daemon(self):
     """
     Task loop that update response counts
     and ends polls that need to be ended
     """
     ongoing_polls = Poll.where('ended', False).get()
     for poll in ongoing_polls:
         if ut.get_utc_time() >= poll.end_date:
             await self.end_poll(poll)
Exemplo n.º 2
0
    async def on_poll_react(self, payload):
        """
        Listens for reactions to poll messages
        """

        # Ignores if any bots reacts
        if payload.member.bot:
            return

        # Ignores react if the message doesn't correspond to a poll
        message_id = payload.message_id
        poll = Poll.where('message_id', message_id).first()
        if not poll:
            return

        channel = self.bot.get_channel(payload.channel_id)
        try:
            message = await channel.fetch_message(message_id)
        except discord.errors.NotFound:
            return

        user = payload.member
        emoji = payload.emoji
        if emoji.name == DELETE_POLL_EMOJI:
            deleted = await self.user_delete_poll(poll, message, user)
            if not deleted:
                await message.remove_reaction(emoji, user)
            return

        # New responses after the poll has ended are not accepted
        end_date = poll.end_date
        if ut.get_utc_time() >= end_date or poll.ended:
            try:
                await message.remove_reaction(emoji, user)
            except discord.errors.NotFound:
                pass
            return

        if emoji.name == ADD_CHOICE_EMOJI:
            await self.get_new_choice_from_user(poll, message, user)
        elif emoji.name == END_POLL_EMOJI:
            await self.user_end_poll(poll, message, user)
        else:
            choice = poll.choices().where('reaction', str(emoji)).first()
            await self.toggle_poll_response(choice, message, user)

        try:
            await message.remove_reaction(emoji, user)
        except discord.errors.NotFound:
            pass

        if emoji.name not in POLL_CONTROL_EMOJI:
            await self.update_response_counts(poll)