87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
import time
|
|
|
|
try:
|
|
import wikipedia
|
|
|
|
DEPENDENCIES_FOUND = True
|
|
except ImportError:
|
|
DEPENDENCIES_FOUND = False
|
|
|
|
from edmond.plugin import Plugin
|
|
|
|
|
|
class WikipediaPlugin(Plugin):
|
|
|
|
REQUIRED_CONFIGS = [
|
|
"commands",
|
|
"ambiguous_response",
|
|
"empty_response",
|
|
"lang",
|
|
]
|
|
NUM_RETRIES = 3
|
|
|
|
def __init__(self, bot):
|
|
super().__init__(bot)
|
|
if not self.is_ready:
|
|
return
|
|
wikipedia.set_lang(self.config["lang"])
|
|
|
|
def on_pubmsg(self, event):
|
|
if not self.should_handle_command(event.arguments[0]):
|
|
return False
|
|
# "science"
|
|
if self.command.ident == self.config["commands"][0]:
|
|
self.tell_random_summary(event)
|
|
# "definition"
|
|
elif self.command.ident == self.config["commands"][1]:
|
|
self.tell_definition(event)
|
|
return True
|
|
|
|
def tell_random_summary(self, event):
|
|
page = None
|
|
retries = self.NUM_RETRIES
|
|
while retries > 0:
|
|
try:
|
|
page = wikipedia.page(title=wikipedia.random())
|
|
break
|
|
except Exception as exc:
|
|
# The wikipedia package can raise a lot of different stuff,
|
|
# so we sort of have to catch broadly.
|
|
self.bot.log_d(f"Wikipedia exception: {exc}")
|
|
retries -= 1
|
|
if page:
|
|
if plus_plugin := self.bot.get_plugin("plus"):
|
|
def handler(plus_event):
|
|
self.bot.say(plus_event.target, page.url)
|
|
plus_plugin.add_handler(event.target, handler)
|
|
self.bot.say(event.target, page.summary)
|
|
|
|
def tell_definition(self, event):
|
|
page = None
|
|
reply = ""
|
|
retries = self.NUM_RETRIES
|
|
while retries > 0:
|
|
try:
|
|
page = wikipedia.page(title=self.command.content)
|
|
break
|
|
except wikipedia.exceptions.DisambiguationError:
|
|
reply = self.config["ambiguous_response"]
|
|
break
|
|
except wikipedia.exceptions.PageError:
|
|
reply = self.config["empty_response"]
|
|
break
|
|
except:
|
|
reply = self.bot.config["error_message"]
|
|
# Keep trying after a slight delay.
|
|
time.sleep(1)
|
|
retries -= 1
|
|
if page:
|
|
reply = page.summary.split(". ", maxsplit=1)[0]
|
|
if len(reply) > 200:
|
|
reply = reply[:196] + " […]"
|
|
if plus_plugin := self.bot.get_plugin("plus"):
|
|
def handler(plus_event):
|
|
self.bot.say(plus_event.target, page.url)
|
|
plus_plugin.add_handler(event.target, handler)
|
|
self.bot.say(event.target, reply)
|