### # 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): """ [
|-k] 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
, 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