Compare commits

...

2 commits

Author SHA1 Message Date
dece 85ce2902a7 taxref: new plugin! 2022-05-19 14:12:33 +02:00
dece 02399fe96d bot: show fatal error in logs 2022-05-19 14:12:20 +02:00
3 changed files with 86 additions and 7 deletions

View file

@ -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<thing>\\S+) to (?P<person>\\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",

View file

@ -118,8 +118,8 @@ class Bot(irc.client.SimpleIRCClient, Logger):
self.start()
except KeyboardInterrupt:
self.log_i("Caught keyboard interrupt.")
except: # Yes, I know, who are you going to call?
self.log_i("Caught unhandled exception.")
except Exception as exc: # Yes, I know, who are you going to call?
self.log_c(f"Caught unhandled exception: {exc}")
finally:
self.cleanup()

73
edmond/plugins/taxref.py Normal file
View file

@ -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)