taxref: do not show ambig. reply needlessly

esp. if there is a matching species with the exact same name…
This commit is contained in:
dece 2022-06-16 16:59:58 +02:00
parent 2ecec9eeb2
commit 3be1fddd93
2 changed files with 43 additions and 20 deletions

View file

@ -165,7 +165,8 @@
"commands": ["taxref"], "commands": ["taxref"],
"not_found_reply": "Not found!", "not_found_reply": "Not found!",
"reply": "{sci_name}, {fr_name}, {family}, {cd_nom}, {cd_ref}", "reply": "{sci_name}, {fr_name}, {family}, {cd_nom}, {cd_ref}",
"ambiguous_reply": "Ambiguous! It can be: " "ambiguous_reply": "Ambiguous! It can be: ",
"unnamed_species": "(no name)"
}, },
"translate": { "translate": {
"commands": ["translate"], "commands": ["translate"],

View file

@ -11,7 +11,8 @@ BASE_URL = "https://taxref.mnhn.fr/api"
class TaxrefPlugin(Plugin): class TaxrefPlugin(Plugin):
REQUIRED_CONFIGS = [ REQUIRED_CONFIGS = [
"commands", "not_found_reply", "reply", "ambiguous_reply" "commands", "not_found_reply", "reply", "ambiguous_reply",
"unnamed_species"
] ]
def __init__(self, bot): def __init__(self, bot):
@ -26,8 +27,12 @@ class TaxrefPlugin(Plugin):
return True return True
def search_by_name(self, name, target): def search_by_name(self, name, target):
name = urllib.parse.quote(name.lower()) name = name.lower()
url = f"{BASE_URL}/taxa/search?scientificNames={name}&page=1&size=100" enc_name = urllib.parse.quote(name)
url = (
f"{BASE_URL}/taxa/search?scientificNames={enc_name}"
"&page=1&size=100"
)
response = requests.get(url) response = requests.get(url)
if response.status_code != 200: if response.status_code != 200:
self.signal_failure(target) self.signal_failure(target)
@ -49,32 +54,49 @@ class TaxrefPlugin(Plugin):
for item in items: for item in items:
if item["rankId"] == "ES": if item["rankId"] == "ES":
species_items.append(item) species_items.append(item)
if len(species_items) == 1: num_species = len(species_items)
self.bot.log_d(f"{num_species} species.")
if num_species == 1:
item_to_use = species_items[0] item_to_use = species_items[0]
else: else:
reply = self.config["ambiguous_reply"] # If there are several species, check if one of them has the
append = "" # exact same name; else show an ambiguous reply.
if len(items) > 5: species_with_same_name = [
append = f"… (+{len(items)})" item for item in species_items
items = items[:5] if item["scientificName"].lower() == name
reply += ", ".join( ]
item["scientificName"] for item in items if len(species_with_same_name) != 1:
) self.show_ambiguous_reply(species_items, target)
if append:
reply += append
self.bot.say(target, reply)
return return
item_to_use = species_with_same_name[0]
unnamed = self.config["unnamed_species"]
reply = self.config["reply"].format( reply = self.config["reply"].format(
sci_name=item_to_use["scientificName"], sci_name=item_to_use["scientificName"],
fr_name=item_to_use["frenchVernacularName"], fr_name=item_to_use["frenchVernacularName"] or unnamed,
family=item_to_use["familyName"], family=item_to_use["familyName"],
cd_nom=item_to_use["id"], cd_nom=item_to_use["id"],
cd_ref=item_to_use["referenceId"], cd_ref=item_to_use["referenceId"],
) )
self.bot.say(target, reply) self.bot.say(target, reply)
# If there are media available, show one! self.show_images(item_to_use, target)
m_url = item_to_use.get("_links", {}) .get("media", {}) .get("href")
def show_ambiguous_reply(self, items, target):
"""Show a reply with potential species."""
reply = self.config["ambiguous_reply"]
append = ""
if len(items) > 5:
append = f"… (+{len(items)})"
items = items[:5]
reply += ", ".join(item["scientificName"] for item in items)
if append:
reply += append
self.bot.say(target, reply)
def show_images(self, item, target):
"""If there are media available, show one!"""
m_url = item.get("_links", {}) .get("media", {}) .get("href")
if not m_url: if not m_url:
return return