From 85ce2902a71d67aa40179fdf1d261d2de839a407 Mon Sep 17 00:00:00 2001 From: dece Date: Thu, 19 May 2022 14:12:33 +0200 Subject: [PATCH] taxref: new plugin! --- config.json.example | 16 ++++++--- edmond/plugins/taxref.py | 73 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 edmond/plugins/taxref.py diff --git a/config.json.example b/config.json.example index 1a764e8..fb135c8 100644 --- a/config.json.example +++ b/config.json.example @@ -41,16 +41,16 @@ "capture_sentence": "Catch!", "captured_sentence": "Well done {winner}, you got that {thing}!" }, - "capturelist": { - "commands": ["collection"], - "reply": "{target} captured {num} things : {things}", - "empty_reply": "{target} did not capture anything yet!" - }, "capturegive": { "commands": ["give"], "content_regex": "my (?P\\S+) to (?P\\S+)", "no_such_thing_reply": "You don't have such {thing}." }, + "capturelist": { + "commands": ["collection"], + "reply": "{target} captured {num} things : {things}", + "empty_reply": "{target} did not capture anything yet!" + }, "common": { "command_suffix": "please", "handling_conditions": { @@ -159,6 +159,12 @@ "wakeup_messages": ["/me wakes up"], "snore_rate": 1.0 }, + "taxref": { + "commands": ["taxref"], + "not_found_reply": "Not found!", + "reply": "{sci_name}, {fr_name}, {family}, {cd_nom}, {cd_ref}", + "ambiguous_reply": "Ambiguous! It can be: " + }, "translate": { "commands": ["translate"], "default_dest": "en", diff --git a/edmond/plugins/taxref.py b/edmond/plugins/taxref.py new file mode 100644 index 0000000..b8bc055 --- /dev/null +++ b/edmond/plugins/taxref.py @@ -0,0 +1,73 @@ +import urllib.parse + +import requests + +from edmond.plugin import Plugin + +BASE_URL = "https://taxref.mnhn.fr/api" + + +class TaxrefPlugin(Plugin): + + REQUIRED_CONFIGS = [ + "commands", "not_found_reply", "reply", "ambiguous_reply" + ] + + def __init__(self, bot): + super().__init__(bot) + + def on_pubmsg(self, event): + if not self.should_handle_command(event.arguments[0]): + return False + + if self.command.ident == self.config["commands"][0]: + self.search_by_name(self.command.content, event.target) + return True + + def search_by_name(self, name, target): + name = urllib.parse.quote(name.lower()) + url = f"{BASE_URL}/taxa/search?scientificNames={name}&page=1&size=100" + response = requests.get(url) + if response.status_code != 200: + self.signal_failure(target) + return + data = response.json() + items = data.get("_embedded", {}).get("taxa", []) + + if not items: + self.bot.say(target, self.config["not_found_reply"]) + return + + if len(items) == 1: + # Only one result: use it. + item_to_use = items[0] + else: + # More than one result: if the results contain a corresponding + # species, use it, else return names for sub-species etc. + species_items = [] + for item in items: + if item["rankId"] == "ES": + species_items.append(item) + if len(species_items) == 1: + item_to_use = species_items[0] + else: + 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) + return + reply = self.config["reply"].format( + sci_name=item_to_use["scientificName"], + fr_name=item_to_use["frenchVernacularName"], + family=item_to_use["familyName"], + cd_nom=item_to_use["id"], + cd_ref=item_to_use["referenceId"], + ) + self.bot.say(target, reply)