Beispiel #1
0
async def system_fronthistory(ctx: CommandContext, system: System):
    lines = []
    front_history = await pluralkit.utils.get_front_history(ctx.conn, system.id, count=10)

    if not front_history:
        raise CommandError("You have no logged switches. Use `pk;switch´ to start logging.")

    for i, (timestamp, members) in enumerate(front_history):
        # Special case when no one's fronting
        if len(members) == 0:
            name = "(no fronter)"
        else:
            name = ", ".join([member.name for member in members])

        # Make proper date string
        time_text = ctx.format_time(timestamp)
        rel_text = display_relative(timestamp)

        delta_text = ""
        if i > 0:
            last_switch_time = front_history[i - 1][0]
            delta_text = ", for {}".format(display_relative(timestamp - last_switch_time))
        lines.append("**{}** ({}, {} ago{})".format(name, time_text, rel_text, delta_text))

    embed = embeds.status("\n".join(lines) or "(none)")
    embed.title = "Past switches"
    await ctx.reply(embed=embed)
Beispiel #2
0
async def show_help(ctx: CommandContext):
    embed = embeds.status("")
    embed.title = "PluralKit Help"
    embed.set_footer(text="By Astrid (Ske#6201; pk;member qoxvy) | GitHub: https://github.com/xSke/PluralKit/")

    category = ctx.pop_str() if ctx.has_next() else None

    from pluralkit.bot.help import help_pages
    if category in help_pages:
        for name, text in help_pages[category]:
            if name:
                embed.add_field(name=name, value=text)
            else:
                embed.description = text
    else:
        return CommandError("Unknown help page '{}'.".format(category))

    await ctx.reply(embed=embed)
Beispiel #3
0
async def system_frontpercent(ctx: CommandContext, args: List[str]):
    # Parse the time limit (will go this far back)
    before = dateparser.parse(" ".join(args),
                              languages=["en"],
                              settings={
                                  "TO_TIMEZONE": "UTC",
                                  "RETURN_AS_TIMEZONE_AWARE": False
                              })

    # If time is in the future, just kinda discard
    if before and before > datetime.utcnow():
        before = None

    # Fetch list of switches
    all_switches = await pluralkit.utils.get_front_history(
        ctx.conn, ctx.system.id, 99999)
    if not all_switches:
        return embeds.error("No switches registered to this system.")

    # Cull the switches *ending* before the limit, if given
    # We'll need to find the first switch starting before the limit, then cut off every switch *before* that
    if before:
        for last_stamp, _ in all_switches:
            if last_stamp < before:
                break

        all_switches = [(stamp, members) for stamp, members in all_switches
                        if stamp >= last_stamp]

    start_times = [stamp for stamp, _ in all_switches]
    end_times = [datetime.utcnow()] + start_times
    switch_members = [members for _, members in all_switches]

    # Gonna save a list of members by ID for future lookup too
    members_by_id = {}

    # Using the ID as a key here because it's a simple number that can be hashed and used as a key
    member_times = {}
    for start_time, end_time, members in zip(start_times, end_times,
                                             switch_members):
        # Cut off parts of the switch that occurs before the time limit (will only happen if this is the last switch)
        if before and start_time < before:
            start_time = before

        # Calculate length of the switch
        switch_length = end_time - start_time

        def add_switch(member_id, length):
            if member_id not in member_times:
                member_times[member_id] = length
            else:
                member_times[member_id] += length

        for member in members:
            # Add the switch length to the currently registered time for that member
            add_switch(member.id, switch_length)

            # Also save the member in the ID map for future reference
            members_by_id[member.id] = member

        # Also register a no-fronter switch with the key None
        if not members:
            add_switch(None, switch_length)

    # Find the total timespan of the range
    span_start = max(start_times[-1], before) if before else start_times[-1]
    total_time = datetime.utcnow() - span_start

    embed = embeds.status("")
    for member_id, front_time in sorted(member_times.items(),
                                        key=lambda x: x[1],
                                        reverse=True):
        member = members_by_id[member_id] if member_id else None

        # Calculate percent
        fraction = front_time / total_time
        percent = int(fraction * 100)

        embed.add_field(name=member.name if member else "(no fronter)",
                        value="{}% ({})".format(
                            percent, humanize.naturaldelta(front_time)))

    embed.set_footer(text="Since {}".format(
        span_start.isoformat(sep=" ", timespec="seconds")))
    return embed