async def pack_list(self, ctx): """Lists your available packs.""" available_pack_names = await self.bot.mdb.packs.find( Pack.view_query(str(ctx.author.id)), ['name']).to_list(None) await ctx.send( f"Your available packs: {', '.join(p['name'] for p in available_pack_names)}" )
async def pack(self, ctx, *, name=None): """Commands to manage homebrew items. When called without an argument, lists the current pack and its description. When called with a name, switches to a different pack.""" user_packs = await self.bot.mdb.packs.count_documents( Pack.view_query(str(ctx.author.id))) if not user_packs: return await ctx.send( "You have no packs. You can make one at <https://avrae.io/dashboard/homebrew/items>!" ) if name is None: pack = await Pack.from_ctx(ctx) else: try: pack = await select_pack(ctx, name) except NoActiveBrew: return await ctx.send( "You have no packs. You can make one at <https://avrae.io/dashboard/homebrew/items>!" ) except NoSelectionElements: return await ctx.send("Pack not found.") await pack.set_active(ctx) embed = HomebrewEmbedWithAuthor(ctx) embed.title = pack.name embed.description = pack.desc if pack.image: embed.set_thumbnail(url=pack.image) itemnames = "\n".join(i['name'] for i in pack.items) if len(itemnames) < 1020: embed.add_field(name="Items", value=itemnames) else: embed.add_field(name="Items", value=f"{len(pack.items)} items.") await ctx.send(embed=embed)
async def item_lookup(self, ctx, *, name): """Looks up an item.""" guild_settings = await self.get_settings(ctx.guild) pm = guild_settings.get("pm_result", False) srd = guild_settings.get("srd", False) self.bot.rdb.incr('items_looked_up_life') try: pack = await Pack.from_ctx(ctx) custom_items = pack.get_search_formatted_items() except NoActiveBrew: custom_items = [] choices = list(itertools.chain(c.items, custom_items)) if ctx.guild: async for servpack in ctx.bot.mdb.packs.find({"server_active": str(ctx.guild.id)}): choices.extend(Pack.from_dict(servpack).get_search_formatted_items()) def get_homebrew_formatted_name(_item): if _item.get('source') == 'homebrew': return f"{_item['name']} ({HOMEBREW_EMOJI})" return _item['name'] result, metadata = await search_and_select(ctx, choices, name, lambda e: e['name'], srd=srd, selectkey=get_homebrew_formatted_name, return_metadata=True) metadata['srd'] = srd metadata['homebrew'] = result.get('source') == 'homebrew' await self.add_training_data("item", name, result['name'], metadata=metadata) embed = EmbedWithAuthor(ctx) item = result if not item['srd'] and srd: return await self.send_srd_error(ctx, result) name = item['name'] proptext = "" if not item.get('source') == 'homebrew': damage = '' extras = '' properties = [] if 'type' in item: type_ = ', '.join( i for i in ([ITEM_TYPES.get(t, 'n/a') for t in item['type'].split(',')] + ["Wondrous Item" if item.get('wondrous') else '']) if i) for iType in item['type'].split(','): if iType in ('M', 'R', 'GUN'): damage = f"{item.get('dmg1', 'n/a')} {DMGTYPES.get(item.get('dmgType'), 'n/a')}" \ if 'dmg1' in item and 'dmgType' in item else '' type_ += f', {item.get("weaponCategory")}' if iType == 'S': damage = f"AC +{item.get('ac', 'n/a')}" if iType == 'LA': damage = f"AC {item.get('ac', 'n/a')} + DEX" if iType == 'MA': damage = f"AC {item.get('ac', 'n/a')} + DEX (Max 2)" if iType == 'HA': damage = f"AC {item.get('ac', 'n/a')}" if iType == 'SHP': # ships for p in ("CREW", "PASS", "CARGO", "DMGT", "SHPREP"): a = PROPS.get(p, 'n/a') proptext += f"**{a.title()}**: {c.itemprops[p]}\n" extras = f"Speed: {item.get('speed')}\nCarrying Capacity: {item.get('carryingcapacity')}\n" \ f"Crew {item.get('crew')}, AC {item.get('vehAc')}, HP {item.get('vehHp')}" if 'vehDmgThresh' in item: extras += f", Damage Threshold {item['vehDmgThresh']}" if iType == 'siege weapon': extras = f"Size: {SIZES.get(item.get('size'), 'Unknown')}\n" \ f"AC {item.get('ac')}, HP {item.get('hp')}\n" \ f"Immunities: {item.get('immune')}" else: type_ = ', '.join( i for i in ("Wondrous Item" if item.get('wondrous') else '', item.get('technology')) if i) rarity = str(item.get('rarity')).replace('None', '') if 'tier' in item: if rarity: rarity += f', {item["tier"]}' else: rarity = item['tier'] type_and_rarity = type_ + (f", {rarity}" if rarity else '') value = (item.get('value', 'n/a') + (', ' if 'weight' in item else '')) if 'value' in item else '' weight = (item.get('weight', 'n/a') + (' lb.' if item.get('weight') == '1' else ' lbs.')) \ if 'weight' in item else '' weight_and_value = value + weight for prop in item.get('property', []): if not prop: continue a = b = prop a = PROPS.get(a, 'n/a') if b in c.itemprops: proptext += f"**{a.title()}**: {c.itemprops[b]}\n" if b == 'V': a += " (" + item.get('dmg2', 'n/a') + ")" if b in ('T', 'A'): a += " (" + item.get('range', 'n/a') + "ft.)" if b == 'RLD': a += " (" + item.get('reload', 'n/a') + " shots)" properties.append(a) properties = ', '.join(properties) damage_and_properties = f"{damage} - {properties}" if properties else damage damage_and_properties = (' --- ' + damage_and_properties) if weight_and_value and damage_and_properties else \ damage_and_properties meta = f"*{type_and_rarity}*\n{weight_and_value}{damage_and_properties}\n{extras}" text = item['desc'] if 'reqAttune' in item: if item['reqAttune'] is True: # can be truthy, but not true embed.add_field(name="Attunement", value=f"Requires Attunement") else: embed.add_field(name="Attunement", value=f"Requires Attunement {item['reqAttune']}") embed.set_footer(text=f"Item | {item.get('source', 'Unknown')} {item.get('page', 'Unknown')}") else: meta = item['meta'] text = item['desc'] if 'image' in item: embed.set_thumbnail(url=item['image']) add_homebrew_footer(embed) embed.title = name embed.description = meta # no need to render, has been prerendered if proptext: text = f"{text}\n{proptext}" if len(text) > 5500: text = text[:5500] + "..." field_name = "Description" for piece in [text[i:i + 1024] for i in range(0, len(text), 1024)]: embed.add_field(name=field_name, value=piece) field_name = "** **" if pm: await ctx.author.send(embed=embed) else: await ctx.send(embed=embed)