Source code for inatcog.commands.map

"""Module for map command group."""

from typing import Optional
import urllib.parse

from dronefly.core.formatters.constants import WWW_BASE_URL
from dronefly.core.formatters.generic import format_taxon_name
from dronefly.discord.embeds import make_embed
from redbot.core import checks, commands
from redbot.core.commands import BadArgument

from inatcog.converters.reply import TaxonReplyConverter
from inatcog.embeds.common import apologize
from inatcog.embeds.inat import INatEmbeds
from inatcog.interfaces import MixinMeta
from inatcog.utils import use_client


[docs]class CommandsMap(INatEmbeds, MixinMeta): """Mixin providing taxon command group.""" @commands.group(invoke_without_command=True) @checks.bot_has_permissions(embed_links=True) @use_client async def map(self, ctx, *, taxa_list: Optional[str] = ""): """Show range map for a list of one or more taxa. **Examples:** ``` [p]map polar bear [p]map 24255,24267 [p]map boreal chorus frog,western chorus frog ``` See `[p]taxon_query` for help specifying taxa. """ query_response = None _taxa_list = "" try: _query = await TaxonReplyConverter.convert(ctx, "", allow_empty=True) query_response = await self.query.get(ctx, _query) except (BadArgument, LookupError) as err: await apologize(ctx, str(err)) return if query_response and query_response.taxon: _taxa_list = str(query_response.taxon.id) if taxa_list: _taxa_list = [_taxa_list, taxa_list] _taxa_list = ",".join(_taxa_list) else: _taxa_list = taxa_list if not _taxa_list: await ctx.send_help() return try: (taxa, missing_taxa) = await self.taxon_query.query_taxa(ctx, _taxa_list) except (BadArgument, LookupError) as err: await apologize(ctx, str(err)) return embed = await self.make_map_embed(ctx, taxa, missing_taxa) await ctx.send(embed=embed) @map.command(name="obs") @use_client async def map_obs(self, ctx, *, query: Optional[TaxonReplyConverter]): """Show map of observations.""" try: _query = query or await TaxonReplyConverter.convert(ctx, "") query_response = await self.query.get(ctx, _query) kwargs = query_response.obs_args() # TODO: determine why we don't just use QueryResponse.obs_query_description # and either use it directly or otherwise share code instead of duplicating # most of it here. if query_response.taxon: query_title = "Map of " + format_taxon_name( query_response.taxon, with_term=True ) else: query_title = "Map of observations" if query_response.user: query_title += f" by {query_response.user.login}" if query_response.unobserved_by: query_title += f" unobserved by {query_response.unobserved_by.login}" if query_response.id_by: query_title += f" identified by {query_response.id_by.login}" if query_response.except_by: query_title += f" except by {query_response.except_by.login}" if query_response.project: query_title += f" in {query_response.project.title}" if query_response.place: query_title += f" from {query_response.place.display_name}" except (BadArgument, LookupError) as err: await apologize(ctx, err.args[0]) return url = f"{WWW_BASE_URL}/observations/map?{urllib.parse.urlencode(kwargs)}" await ctx.send(embed=make_embed(url=url, title=query_title))