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)))
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
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
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)
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)))
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}.")
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)}")