import irc.bot from random import choice import whoosh from whoosh import qparser import whoosh.index class BotsWaller (irc.bot.SingleServerIRCBot): def __init__(self, indexdir, channel, nickname, server, port=6667): irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) self.channel = channel self.indexdir = indexdir self.ix = whoosh.index.open_dir(self.indexdir) self.parser = whoosh.qparser.QueryParser("text", schema=self.ix.schema, group=qparser.OrGroup) def on_welcome(self, c, e): c.join(self.channel) print ("join") def on_privmsg(self, c, e): pass def on_pubmsg(self, c, e): # print e.arguments, e.target, e.source, e.arguments, e.type msg = e.arguments[0] with self.ix.searcher() as searcher: query = self.parser.parse(msg) results = searcher.search(query, terms=True) results.fragmenter = whoosh.highlight.WholeFragmenter() results.formatter = whoosh.highlight.UppercaseFormatter() # could eventually use results[x].score as "confidence" to respond if len(results) > 0: results = list(results) r = choice(results) c.privmsg(self.channel, r.highlights("text")) if __name__ == "__main__": import sys, argparse parser = argparse.ArgumentParser(description='Fats Waller Wikipedia Bot') parser.add_argument('--index', default='index', help='path to whoosh index') parser.add_argument('--server', default='irc.freenode.net', help='server hostname') parser.add_argument('--port', default=6667, type=int, help='server port') parser.add_argument('--channel', default='#botopera', help='channel to join') parser.add_argument('--nickname', default='BOTSwaller', help='bot nickname') args = parser.parse_args() bot = BotsWaller(args.index, args.channel, args.nickname, args.server, args.port) bot.start()