Compare commits

..

2 commits

Author SHA1 Message Date
dece ae21c1ff8b wikipedia: fix crash 2022-09-04 15:27:13 +02:00
dece 655f160a29 plus: add shortcut 2022-09-04 15:26:52 +02:00
4 changed files with 34 additions and 22 deletions

View file

@ -151,7 +151,8 @@
"commands": ["plus"], "commands": ["plus"],
"aliases": { "aliases": {
"plus": "more" "plus": "more"
} },
"shortcut": "+"
}, },
"randomchoice": { "randomchoice": {
"commands": ["choose"], "commands": ["choose"],

View file

@ -37,13 +37,13 @@ class Plugin:
plugins. It can also save data using the Bot's storage feature to be plugins. It can also save data using the Bot's storage feature to be
available after a restart. available after a restart.
Initalisation should be very fast, no network connections or anything. They Initialisation should be very fast, no network connections or anything.
are initialised before connecting to the server, so their `is_ready` flag They are initialised before connecting to the server, so their `is_ready`
is set at that point. The loading order is more or less random, so a plugin flag is set at that point. The loading order is more or less random, so a
cannot assume another has been loaded during initialisation. If it wants to plugin cannot assume another has been loaded during initialisation. If it
interact with another plugin, the earliest point to do that is in the wants to interact with another plugin, the earliest point to do that is in
on_welcome callback which is called after connecting to a server, and can the on_welcome callback which is called after connecting to a server, and
disable itself by setting its own `is_ready` flag to false. can disable itself by setting its own `is_ready` flag to false.
A plugin can access its config once the base `__init__` has been called. A plugin can access its config once the base `__init__` has been called.
The configuration is valid only is `is_ready` is True, else accessing its The configuration is valid only is `is_ready` is True, else accessing its

View file

@ -4,29 +4,38 @@ from edmond.plugin import Plugin
class PlusPlugin(Plugin): class PlusPlugin(Plugin):
"""Plugin to store additional content from other plugins. """Plugin to store additional content from other plugins.
This plugin does not do much on its own, it lets other plugins register additional This plugin does not do much on its own, it lets other plugins register
content to compute on the fly when asked, e.g. the Wikipedia plugin can store the additional content to compute on the fly when asked, e.g. the Wikipedia
Web page of the definition they just gave so users wanting to know more about a plugin can store the Web page of the definition they just gave so users
definition can use the "plus" function to get the URL to the Web page. wanting to know more about a definition can use the "plus" function to get
the URL to the Web page.
There can be only one handle registered at one time by target (so by channel, user, There can be only one handle registered at one time by target (so by
etc). External plugins use the `add_handler` to set the current handler for a channel, user, etc). External plugins use the `add_handler` to set the
target. current handler for a target.
""" """
REQUIRED_CONFIGS = ["commands"]
def __init__(self, bot): def __init__(self, bot):
super().__init__(bot) super().__init__(bot)
self.handlers = {} self.handlers = {}
self.shortcut = self.config.get("shortcut")
def on_pubmsg(self, event): def on_pubmsg(self, event):
if not self.should_handle_command(event.arguments[0], no_content=True): if (
return False (self.shortcut and event.arguments[0].strip() == self.shortcut)
or self.should_handle_command(event.arguments[0], no_content=True)
):
self.process_handler(event)
return True
return False
def process_handler(self, event):
if handler := self.handlers.pop(event.target, None): if handler := self.handlers.pop(event.target, None):
handler(event) handler(event)
else: else:
self.signal_failure(event.target) self.signal_failure(event.target)
return True
def add_handler(self, target: str, handler): def add_handler(self, target: str, handler):
self.handlers[target] = handler self.handlers[target] = handler

View file

@ -38,14 +38,16 @@ class WikipediaPlugin(Plugin):
return True return True
def tell_random_summary(self, event): def tell_random_summary(self, event):
summary = "" page = None
retries = self.NUM_RETRIES retries = self.NUM_RETRIES
while retries > 0: while retries > 0:
try: try:
page = wikipedia.page(title=wikipedia.random(), sentences=1) page = wikipedia.page(title=wikipedia.random())
break break
except: # The wikipedia package can raise a lot of different stuff. except Exception as exc:
pass # 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 retries -= 1
if page: if page:
if plus_plugin := self.bot.get_plugin("plus"): if plus_plugin := self.bot.get_plugin("plus"):