aboutsummaryrefslogtreecommitdiff
path: root/Manpages/plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'Manpages/plugin.py')
-rw-r--r--Manpages/plugin.py99
1 files changed, 99 insertions, 0 deletions
diff --git a/Manpages/plugin.py b/Manpages/plugin.py
new file mode 100644
index 0000000..e3913d1
--- /dev/null
+++ b/Manpages/plugin.py
@@ -0,0 +1,99 @@
+###
+# Copyright (c) 2021, B. Watson
+# All rights reserved.
+#
+#
+###
+
+import os
+import subprocess
+import sys
+import re
+import sqlite3
+
+from supybot import utils, plugins, ircutils, callbacks
+from supybot.commands import *
+import supybot.utils.minisix as minisix
+
+try:
+ from supybot.i18n import PluginInternationalization
+ _ = PluginInternationalization('Manpages')
+except ImportError:
+ # Placeholder that allows to run the plugin on a bot
+ # without the i18n module
+ _ = lambda x: x
+
+
+class Manpages(callbacks.Plugin):
+ """Provides Unix manpage lookups"""
+ threaded = True
+
+ db = None
+
+ def InitDB(self):
+ if self.db is None:
+ filename = self.registryValue('dbpath')
+ if(os.path.exists(filename)):
+ self.db = sqlite3.connect(filename)
+ return self.db
+
+ # man() is a *very* limited subset of what the real
+ # man command does. Should maybe be called whatis instead,
+ # use the Aka plugin to create an alias:
+ # load Aka
+ # aka add whatis man $*
+ def man(self, irc, msg, args, sect_or_page, page):
+ """ [<section>|-k] <page>
+
+ Look up man pages and show their summaries. Without -k, searches
+ man pages by name (same as the OS "whatis" or "man -f" commands).
+ With -k, also searches descriptions (same as OS "man -k" or "apropos").
+ With <section>, limits search to a single man section (otherwise all
+ sections are searched).
+ """
+
+ db = self.InitDB();
+ if db is None:
+ irc.error("manpage database doesn't exist", Raise=True)
+
+ maxresults = self.registryValue('maxresults')
+ if msg.channel is None:
+ # private message, increase limit
+ maxresults *= 5
+
+ cursor = db.cursor()
+
+ errmsg = "No manual entry for "
+
+ selectfrom = "select page, section, desc from whatis "
+ orderby = " order by section "
+ limit = " limit " + str(maxresults + 1) + " "
+
+ if page is None:
+ cursor.execute(selectfrom + "where page glob ?" + orderby + limit, (sect_or_page,))
+ errmsg = errmsg + sect_or_page
+ else:
+ if sect_or_page == "-k":
+ glob = "*" + page + "*"
+ cursor.execute(selectfrom + "where page glob ? or desc glob ? " + orderby + limit, (glob, glob))
+ errmsg = "No man pages matching " + page
+ else:
+ cursor.execute(selectfrom + "where section=? and page glob ? " + orderby + limit, (sect_or_page, page))
+ errmsg = errmsg + page + " in section " + sect_or_page
+
+ result = cursor.fetchall()
+
+ lines = []
+
+ if len(result) == 0:
+ irc.reply(errmsg)
+ else:
+ for (page, section, desc) in result:
+ lines.append(ircutils.bold(page + "(" + section + ")") + ": " + desc)
+ if(len(result) > maxresults):
+ lines.append("[too many results, only showing first " + str(maxresults) + "]")
+ irc.replies(lines, joiner=' | ')
+
+ man = thread(wrap(man, ['somethingWithoutSpaces', optional('somethingWithoutSpaces')]))
+
+Class = Manpages