Ejemplo n.º 1
0
 async def bestiary_server_list(self, ctx):
     """Shows what bestiaries are currently active on the server."""
     desc = []
     async for best in Bestiary.server_bestiaries(ctx):
         sharer = await best.get_server_sharer(ctx)
         desc.append(f"{best.name} (<@{sharer}>)")
     await ctx.send(embed=discord.Embed(title="Active Server Bestiaries", description="\n".join(desc)))
Ejemplo n.º 2
0
async def get_monster_choices(ctx, filter_by_license=True, homebrew=True):
    """
    Gets a list of monsters in the current context for the user to choose from.

    :param ctx: The context.
    :param filter_by_license: Whether to filter out entities the user cannot access.
    :param homebrew: Whether to include homebrew entities.
    """
    if filter_by_license:
        available_monsters = await available(ctx, compendium.monsters,
                                             'monster')
    else:
        available_monsters = compendium.monsters

    if not homebrew:
        return available_monsters

    # personal bestiary
    try:
        bestiary = await Bestiary.from_ctx(ctx)
        await bestiary.load_monsters(ctx)
        custom_monsters = bestiary.monsters
        bestiary_id = bestiary.id
    except NoActiveBrew:
        custom_monsters = []
        bestiary_id = None

    # server bestiaries
    choices = list(itertools.chain(available_monsters, custom_monsters))
    if ctx.guild:
        async for servbestiary in Bestiary.server_bestiaries(ctx):
            if servbestiary.id != bestiary_id:
                await servbestiary.load_monsters(ctx)
                choices.extend(servbestiary.monsters)
    return choices
Ejemplo n.º 3
0
def migrate(bestiary):
    sha256 = hashlib.sha256()
    hash_str = json.dumps(bestiary['monsters']).encode() \
               + bestiary['name'].encode() \
               + str(bestiary.get('desc')).encode()
    sha256.update(hash_str)

    active = [bestiary['owner']] if bestiary.get('active') else []
    server_active = []
    for serv_sub in bestiary.get('server_active', []):
        server_active.append({
            "subscriber_id": bestiary['owner'],
            "guild_id": serv_sub
        })

    for monster in bestiary['monsters']:
        for key in ('traits', 'actions', 'reactions', 'legactions'):
            for trait in monster[key]:
                if 'attacks' in trait:
                    del trait[
                        'attacks']  # why did we store this in the first place?

    monsters = [Monster.from_bestiary(m) for m in bestiary['monsters']]
    new_bestiary = Bestiary(None, sha256.hexdigest(), bestiary['critterdb_id'],
                            [bestiary['owner']], active, server_active,
                            bestiary['name'], monsters, bestiary.get('desc'))
    return new_bestiary
Ejemplo n.º 4
0
async def select_monster_full(ctx, name, cutoff=5, return_key=False, pm=False, message=None, list_filter=None,
                              return_metadata=False):
    """
    Gets a Monster from the compendium and active bestiary/ies.
    """
    try:
        bestiary = await Bestiary.from_ctx(ctx)
        await bestiary.load_monsters(ctx)
        custom_monsters = bestiary.monsters
        bestiary_id = bestiary.id
    except NoActiveBrew:
        custom_monsters = []
        bestiary_id = None
    choices = list(itertools.chain(compendium.monster_mash, custom_monsters))
    if ctx.guild:
        async for servbestiary in Bestiary.server_bestiaries(ctx):
            if servbestiary.id == bestiary_id:
                continue
            await servbestiary.load_monsters(ctx)
            choices.extend(servbestiary.monsters)

    await Stats.increase_stat(ctx, "monsters_looked_up_life")

    def get_homebrew_formatted_name(monster):
        if monster.source == 'homebrew':
            return f"{monster.name} ({HOMEBREW_EMOJI})"
        return monster.name

    return await search_and_select(ctx, choices, name, lambda e: e.name, cutoff, return_key, pm, message, list_filter,
                                   selectkey=get_homebrew_formatted_name, return_metadata=return_metadata)
Ejemplo n.º 5
0
 async def bestiary_server_list(self, ctx):
     """Shows what bestiaries are currently active on the server."""
     desc = []
     async for best in Bestiary.server_bestiaries(ctx):
         sharer = next(sh for sh in best.server_active
                       if sh['guild_id'] == str(ctx.guild.id))
         desc.append(f"{best.name} (<@{sharer['subscriber_id']}>)")
     await ctx.send(embed=discord.Embed(title="Active Server Bestiaries",
                                        description="\n".join(desc)))
Ejemplo n.º 6
0
    async def bestiary_server_remove(self, ctx, bestiary_name):
        """Removes a server bestiary."""
        bestiaries = []
        async for best in Bestiary.server_bestiaries(ctx):
            bestiaries.append(best)

        bestiary = await search_and_select(ctx, bestiaries, bestiary_name, lambda b: b.name)
        await bestiary.toggle_server_active(ctx)
        await ctx.send(f"Ok, {bestiary.name} is no longer active on {ctx.guild.name}.")
Ejemplo n.º 7
0
 async def bestiary_list(self, ctx):
     """Lists your available bestiaries."""
     out = [b.name async for b in Bestiary.user_bestiaries(ctx)]
     await ctx.send(f"Your bestiaries: {', '.join(out)}")