Beispiel #1
0
    async def place(self, ctx: commands.Context, role, *names):
        event = EventModel.load(ctx.channel.id)
        if event is None:
            await ctx.author.send(errors.NONEXISTENT_EVENT)
            return False

        if date.is_date_time_expired(event.date, event.time):
            await ctx.author.send(errors.EXPIRED_EVENT)
            return False

        role = role.title()
        if role and role not in settings.ROLES.ALL:
            await ctx.author.send(errors.NONEXISTENT_ROLE)
            return

        for name in names:
            members = ctx.channel.guild.fetch_members()
            member = await members.find(
                lambda m: utils.fuzzy_string_match(m.display_name, name))
            if member is None:
                await ctx.author.send(errors.NONEXISTENT_MEMBER)
                return

            await self.add_member(ctx.channel, event, member, role)
            utils.log(ctx.author.display_name, "placed player", name, "...")

        embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id)
        await utils.show_event(channel=ctx.channel,
                               client=self.bot,
                               embed=embed)
Beispiel #2
0
    async def create_event(self,
                           ctx: commands.Context,
                           name,
                           date,
                           time,
                           description=""):

        date = try_parse_day(date)
        if not is_valid_date_time(date, time):
            await ctx.author.send(errors.INVALID_DATE.format(date, time))
            return

        if is_date_time_expired(date, time):
            await ctx.author.send(errors.EXPIRED_DATE.format(date, time))
            return

        event = EventModel(self.bot.user.id, name, date, time, description,
                           ctx.channel.id, 0)
        event.save()

        embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id)
        await utils.show_event(channel=ctx.channel,
                               client=self.bot,
                               embed=embed,
                               new_event=True)
        await utils.send_announcement(
            ctx,
            settings.MESSAGE.NEW_EVENT.format(event.name, event.date,
                                              event.time, ctx.channel.mention))
        utils.log(ctx.author.display_name, "created event", event.name, "...")
Beispiel #3
0
    async def edit(self, ctx: commands.Context, *raw_aspects):
        event = EventModel.load(ctx.channel.id)
        if event is None:
            await ctx.author.send(errors.NONEXISTENT_EVENT)
            return

        parsed_aspect_dict, invalids = EventAspectParser.parse(raw_aspects)
        for name, value in parsed_aspect_dict.items():
            event.set_attribute(name, value)

        if len(invalids) > 0:
            await ctx.author.send(errors.INVALID_ASPECTS + '\n' +
                                  '\n'.join(invalids))

        if is_date_time_expired(event.date, event.time):
            await ctx.author.send(
                errors.EXPIRED_DATE.format(event.date, event.time))
            return

        event.save(append=True)

        embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id)
        await utils.show_event(channel=ctx.channel,
                               client=self.bot,
                               embed=embed,
                               new_event=False)
        utils.log(ctx.author.display_name, "edited event", event.name, "...")
Beispiel #4
0
    async def spawn(self, ctx):
        for name in player_names:
            player_id = player_ids[name]
            identifier = player_identifiers[name]
            role = player_roles[name]
            participant = ParticipantModel(player_id, name, identifier, role, ctx.channel.id)
            db.insert_participant(participant)

        embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id)
        await utils.show_event(ctx.channel, self.bot, embed)
Beispiel #5
0
    async def handle_event_response(self, user, channel, role):
        event = EventModel.load(channel.id)

        if event is None:
            await user.send(errors.NONEXISTENT_EVENT)
            return False

        if date.is_date_time_expired(event.date, event.time):
            await user.send(errors.EXPIRED_EVENT)
            return False

        identifier = utils.extract_identifier(user)
        if identifier is None:
            await user.send(errors.NO_VALID_ROLE)
            print("participant tried to sign up without a role.")
            return

        name = user.display_name.title()
        name = utils.prune_participant_name(name)

        if not name:  # Empty string
            await user.send(errors.INVALID_NAME)
            print("participant tried to sign up with a shitty name.")
            return

        current_role = ""
        participant = ParticipantModel.load(channel.id, name)
        if event.is_locked():
            role = settings.ROLES.BACKUP
        else:
            if participant is not None:
                current_role = participant.role

        if current_role == settings.ROLES.BACKUP:
            await user.send(errors.BACKUP_SIGN)
            print("participant tried to sign up but was already backup.")
            return

        if current_role == role:
            return

        participant = ParticipantModel(user.id, name, identifier, role,
                                       channel.id)
        participant.save()

        embed = view.create(channel.id, user.guild.emojis, self.bot.user.id)
        await utils.show_event(channel=channel, client=self.bot, embed=embed)

        utils.log(user.name, "responded to event...")
Beispiel #6
0
    async def unlock(self, ctx: commands.Context):
        event = EventModel.load(ctx.channel.id)
        if event is None:
            await ctx.author.send(errors.NONEXISTENT_EVENT)
            return

        if event.is_locked():
            event.unlock()
            event.save(append=True)
            embed = view.create(ctx.channel.id, ctx.guild.emojis,
                                self.bot.user.id)
            await utils.show_event(channel=ctx.channel,
                                   client=self.bot,
                                   embed=embed,
                                   new_event=False)
Beispiel #7
0
    async def refresh(self, ctx: commands.Context):

        # "re-adds" all members who have reacted to current event
        event_message = await utils.get_event_message(channel=ctx.channel,
                                                      client=self.bot)
        if event_message is None:
            return

        reactions = event_message.reactions

        event = EventModel.load(ctx.channel.id)
        if event is None:
            return
        if is_date_time_expired(event.date, event.time):
            return

        checked_members = []
        for reaction in reactions:
            users = await reaction.users().flatten()
            for user in users:
                member = ctx.channel.guild.get_member(user.id)
                if member is None:
                    utils.log(
                        "Player not found when attempting to add from reactions on +refresh"
                    )
                    return

                role = settings.ROLES.DECLINED if str(
                    reaction) == settings.DECLINE_REACTION else ""

                if not user.bot and member not in checked_members:
                    checked_members.append(member)
                    await self.add_member(ctx.channel, event, member, role)

        embed = view.create(ctx.channel.id, ctx.guild.emojis, self.bot.user.id)
        await utils.show_event(channel=ctx.channel,
                               client=self.bot,
                               embed=embed,
                               new_event=False)