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)
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)