diff --git a/ircbot/plugin/help.py b/ircbot/plugin/help.py index e06592f..3bd805a 100644 --- a/ircbot/plugin/help.py +++ b/ircbot/plugin/help.py @@ -10,7 +10,7 @@ def register(bot): threading.Thread(target=help_server, args=(bot,), daemon=True).start() bot.listen(r'^help$', help, require_mention=True) - bot.listen(r'^macros$', help_macro, require_mention=True) + bot.listen(r'^macros?$', help_macro, require_mention=True) def help(bot, msg): @@ -39,6 +39,11 @@ def render_response(self, template, **context): self.end_headers() self.wfile.write(rendered) + def render_404(self): + self.send_response(404, 'File not found') + self.end_headers() + self.wfile.write(b'404 File not found') + def do_GET(self): if self.path == '/': plugins = collections.defaultdict(set) @@ -55,9 +60,7 @@ def do_GET(self): macros=bot.plugins['macros'].list(bot), ) else: - self.send_response(404, 'File not found') - self.end_headers() - self.wfile.write(b'404 File not found') + self.render_404() return RequestHandler diff --git a/ircbot/plugin/shorturls.py b/ircbot/plugin/shorturls.py new file mode 100644 index 0000000..a2578a9 --- /dev/null +++ b/ircbot/plugin/shorturls.py @@ -0,0 +1,79 @@ +"""Control ocfweb shorturls through ircbot.""" +from ocflib.misc.shorturls import add_shorturl +from ocflib.misc.shorturls import delete_shorturl +from ocflib.misc.shorturls import get_connection as shorturl_db +from ocflib.misc.shorturls import get_shorturl +from ocflib.misc.shorturls import rename_shorturl +from ocflib.misc.shorturls import replace_shorturl + + +def register(bot): + bot.listen(r'^!shorturl get (.+)$', show) + bot.listen(r'^!shorturl add ([^ ]+) (.+)$', add, require_privileged_oper=True) + bot.listen(r'^!shorturl delete ([^ ]+)$', delete, require_privileged_oper=True) + bot.listen(r'^!shorturl rename ([^ ]+) ([^ ]+)$', rename, require_privileged_oper=True) + bot.listen(r'^!shorturl replace ([^ ]+) (.+)$', replace, require_privileged_oper=True) + + +def show(bot, msg): + """Return a shorturl by slug.""" + + slug = msg.match.group(1) + + with shorturl_db() as ctx: + target = get_shorturl(ctx, slug) + + if not target: + msg.respond('shorturl `{}` does not exist.'.format(slug)) + else: + msg.respond(target, ping=False) + + +def add(bot, msg): + """Add a new shorturl.""" + + slug = msg.match.group(1) + target = msg.match.group(2) + + if len(slug) > 100: + msg.respond('shorturl slugs must be <= 100 characters') + return + + with shorturl_db(user='ocfircbot', password=bot.mysql_password) as ctx: + + # validation occurs in ocflib, and uniqueness is guaranteed + # by the database constraint. The error will propagate up if + # someone tries to add or rename an entry that results in a dupe + add_shorturl(ctx, slug, target) + msg.respond('shorturl added as `{}`'.format(slug)) + + +def delete(bot, msg): + """Delete a shorturl.""" + + slug = msg.match.group(1) + with shorturl_db(user='ocfircbot', password=bot.mysql_password) as ctx: + delete_shorturl(ctx, slug) + msg.respond('shorturl `{}` has been deleted.'.format(slug)) + + +def rename(bot, msg): + """Rename a shorturl.""" + + old_slug = msg.match.group(1) + new_slug = msg.match.group(2) + + with shorturl_db(user='ocfircbot', password=bot.mysql_password) as ctx: + rename_shorturl(ctx, old_slug, new_slug) + msg.respond('shorturl `{}` has been renamed to `{}`'.format(old_slug, new_slug)) + + +def replace(bot, msg): + """Replace the target of a shorturl slug.""" + + slug = msg.match.group(1) + new_target = msg.match.group(2) + + with shorturl_db(user='ocfircbot', password=bot.mysql_password) as ctx: + replace_shorturl(ctx, slug, new_target) + msg.respond('shorturl `{}` updated'.format(slug))