예제 #1
0
 async def end_poll(self, ctx):
     """Force end the poll"""
     cool_guy_ref = firebase_handler.query_firestore(
         u'cool_guy', self.data_id)
     uncool_guy_ref = firebase_handler.query_firestore(
         u'uncool_guy', self.data_id)
     cool_guy_data = cool_guy_ref.get().to_dict()
     uncool_guy_data = uncool_guy_ref.get().to_dict()
     await self.complete_poll(cool_guy_data, uncool_guy_data)
     self.complete_poll_job.pause()
     self.complete_poll_job.remove()
예제 #2
0
    def generate_data(self, data_type):
        """Generate, store, and return poll data"""
        if data_type == 'cool_guy':
            role_name = str(config.COOL_ROLE)
        else:
            role_name = str(config.UNCOOL_ROLE)
        data_ref = firebase_handler.query_firestore(data_type, self.data_id)

        # Get previous guy
        role = find(lambda r: r.name == role_name, self.bot.guild.roles)
        prev_cool_guy = next(
            (PreviousGuy(member.display_name, f'{member.id}') for member \
             in self.bot.guild.members \
             if role in member.roles),
             PreviousGuy()
        )

        # Get nominees
        nominees = [
            Nominee(member.display_name, f'{member.id}')
            for member in self.bot.guild.members
            if not member.top_role.name == 'Bots' and not member.bot
        ]

        # Construct, store, and return data
        data = PollData(
            prev_cool_guy,
            nominees,
            datetime.now().strftime('%Y-%m-%d'),
        )
        data_ref.set(PollData.Schema().dump(data))
        return data_ref
예제 #3
0
    async def generate_guy_poll(self, title, color, fields, doc_ref, data):
        """Generate, send, and return the poll message"""

        # Create poll embed
        embed = self.generate_embed(
            title=title,
            description=f'{self.bot.guild.default_role}',
            color=color,
            fields=fields,
            footer='React to cast a vote!')
        message = await self.bot.general_channel.send(embed=embed)
        data['message_id'] = f'{message.id}'
        data['channel_id'] = f'{message.channel.id}'
        doc_ref.update(data)

        # Add reaction options and pin poll
        default_emotes = get_default_emote_queue()
        for nominee in data['nominees']:
            emote_ref = firebase_handler.query_firestore(
                u'member_emotes', str(nominee['id']))
            member_emote = emote_ref.get().to_dict()
            if member_emote is None:
                # Use defaults
                emote = default_emotes.pop(0)
            else:
                # Use custom
                emote = member_emote['emote']
            await message.add_reaction(emote)
        try:
            await message.pin()
        except:
            pass
        return message
예제 #4
0
    async def set_emote(self, ctx, emote, member_name=None):
        """
        Set a member's emote

        Parameters:
        -----------
        emote - emoji, the emote to set to
        member_name (optional) - string, specified member to change. Defaulted to yourself
        """

        # Get member object
        if member_name is None:
            member = ctx.author
        else:
            member = find(
                lambda m: m.display_name == member_name or m.name == member_name,
                self.bot.guild.members
            )
        
        # Update member's emote in the firestore
        doc_ref = firebase_handler.query_firestore(u'member_emotes', str(member.id))
        member_emote = doc_ref.get().to_dict()
        if member_emote is None:
            member_emote = MemberEmoteSchema(member.display_name, emote)
            doc_ref.set(MemberEmoteSchema.Schema().dump(member_emote))
            await ctx.send(f'New profile created for **{str(member)}** with emote "{emote}"')
        else:
            member_emote['emote'] = emote
            doc_ref.update(member_emote)
            await ctx.send(f'Update profile for **{str(member)}** with emote "{emote}"')
예제 #5
0
 async def on_member_join(self, member):
     doc_ref = firebase_handler.query_firestore(u'members', str(member.id))
     data = Member(
         [str(role) for role in member.roles],
         member.display_name,
         member.id
     )
     doc_ref.set(Member.Schema().dump(data))
예제 #6
0
 async def test_firebase(self, ctx):
     """Test firebase calls"""
     me = find(
         lambda m: m.id == int(config.DEV_ID),
         self.bot.guild.members
     )
     doc_ref = firebase_handler.query_firestore(u'members', str(me.id))
     data = doc_ref.get().to_dict()
     if data is not None:
         await ctx.send(data['name'])
예제 #7
0
 async def on_member_update(self, before, after):
     doc_ref = firebase_handler.query_firestore(u'members', str(after.id))
     data = doc_ref.get().to_dict()
     if data is None:
         return
     if before.nick != after.nick:
         data['name'] = after.display_name
     if before.roles != after.roles:
         data['roles'] = [str(role) for role in after.roles]
     doc_ref.update(data)
예제 #8
0
    async def on_raw_reaction_add(self, payload):
        """Handle multiple reactions on the same message"""

        # Get the message
        message = await self.bot.get_channel(payload.channel_id
                                             ).fetch_message(payload.message_id
                                                             )
        if not message.embeds or payload.member.bot:
            return

        # Remove previous reaction from message
        if message.embeds[0].title == 'Cool Guy of the Week Poll':
            cool_guy_ref = firebase_handler.query_firestore(
                u'cool_guy', self.data_id)
            cool_guy_data = cool_guy_ref.get().to_dict()
            if message.id != int(cool_guy_data['message_id']):
                return
            for reaction in message.reactions:
                if (payload.member in await reaction.users().flatten()
                        and (reaction.emoji != payload.emoji
                             and reaction.emoji != payload.emoji.name)):
                    await message.remove_reaction(reaction.emoji,
                                                  payload.member)
        elif message.embeds[0].title == 'Uncool Guy of the Week Poll':
            uncool_guy_ref = firebase_handler.query_firestore(
                u'uncool_guy', self.data_id)
            uncool_guy_data = uncool_guy_ref.get().to_dict()
            if message.id != int(uncool_guy_data['message_id']):
                return
            for reaction in message.reactions:
                if (payload.member in await reaction.users().flatten()
                        and (reaction.emoji != payload.emoji
                             and reaction.emoji != payload.emoji.name)):
                    await message.remove_reaction(reaction.emoji,
                                                  payload.member)
        elif message.embeds[0].title == 'Question:':
            for reaction in message.reactions:
                if (payload.member in await reaction.users().flatten()
                        and reaction.emoji != payload.emoji.name):
                    await message.remove_reaction(reaction.emoji,
                                                  payload.member)
예제 #9
0
    async def set_poll_time(self, ctx, arg: str, value: int):
        """
        Set when the poll happens

        Parameters:
        -----------
        arg - string, either day, duration, hour, or minute
        value - int, 
        \tday - 0, 1, 2, .., 6 (MON = 0, SUN = 6)
        \tduration - seconds (Ex. 21600 = 6 hours)
        \tthour - 0, 1, 2, ..., 23 (Military hours)
        \tminute - 0, 1, 2, ..., 59
        """
        settings_ref = firebase_handler.query_firestore(
            u'poll_settings', 'guy_of_week')
        settings = settings_ref.get().to_dict()

        arg = arg.lower()
        if arg == 'day':
            if value > 6 or value < 0:
                await ctx.send('Please use a value between 0 and 6')
                return
            settings['day'] = value
        elif arg == 'duration':
            settings['duration'] = value
        elif arg == 'hour':
            if value > 23 or value < 0:
                await ctx.send('Please use a value between 0 and 23')
                return
            settings['hour'] = value
        elif arg == 'minute':
            if value > 59 or value < 0:
                await ctx.send('Please use a value between 0 and 59')
                return
            settings['minute'] = value
        else:
            await ctx.send('Invalid type to change. Try again')
            return

        settings_ref.update(settings)
        self.poll_job.reschedule(
            CronTrigger(day_of_week=settings['day'],
                        hour=settings['hour'],
                        minute=settings['minute'],
                        second=0))
        date = self.poll_job.next_run_time
        await ctx.send(
            f"Guy of the week polls will now be sent every {date.strftime('%A')} at {date.strftime('%I:%M %p')}"
        )
예제 #10
0
 def generate_nominees_text(self, poll_data):
     """Generate and return the nominees value"""
     nominees = ""
     default_emotes = get_default_emote_queue()
     for nominee in poll_data['nominees']:
         emote_ref = firebase_handler.query_firestore(
             u'member_emotes', str(nominee['id']))
         member_emote = emote_ref.get().to_dict()
         if member_emote is None:
             # Use defaults
             emote = default_emotes.pop(0)
         else:
             # Use custom
             emote = member_emote['emote']
         nominees += f"{emote} {nominee['name']}\n"
     return nominees
예제 #11
0
    def __init__(self, bot):
        self.bot = bot
        self.data_id = None
        self.complete_poll_job = None

        settings_ref = firebase_handler.query_firestore(
            u'poll_settings', 'guy_of_week')
        settings = settings_ref.get().to_dict()
        self.poll_job = self.bot.scheduler.add_job(
            self.send_guy_of_week_polls,
            CronTrigger(day_of_week=settings['day'],
                        hour=settings['hour'],
                        minute=settings['minute'],
                        second=0,
                        timezone='EST5EDT'))
        next_run_time = self.poll_job.next_run_time.strftime(
            '%Y-%m-%d %I:%M %p')
        logging.info(
            f'"GuyOfWeek.send_guy_of_week_polls" next run time: {next_run_time}'
        )
예제 #12
0
 def get_poll_deadline(self, today):
     """Return the deadline for the polls"""
     settings_ref = firebase_handler.query_firestore(
         u'poll_settings', 'guy_of_week')
     settings = settings_ref.get().to_dict()
     return today + timedelta(seconds=int(settings['duration']))
예제 #13
0
 async def on_member_remove(self, member):
     firebase_handler.query_firestore(u'members', str(member.id)).delete()