#!/usr/bin/env python from __future__ import print_function from __future__ import absolute_import import importlib import logging import optparse import os import sys import provision from types import ModuleType our_dir = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, our_dir) from bot_lib import run_message_handler_for_bot def validate_path(bots_fn): # type: (str) -> None bots_fn = os.path.realpath(bots_fn) if not os.path.dirname(bots_fn).startswith(os.path.normpath(os.path.join(our_dir, "../bots"))): print('Sorry, we will only import code from api/bots.') sys.exit(1) if not bots_fn.endswith('.py'): print('Please use a .py extension for library files.') sys.exit(1) def get_lib_module(bots_fn): # type: (str) -> ModuleType base_bots_fn = os.path.basename(os.path.splitext(bots_fn)[0]) sys.path.insert(1, os.path.dirname(bots_fn)) module_name = base_bots_fn module = importlib.import_module(module_name) return module def run(): # type: () -> None usage = ''' ./run.py Example: ./run.py lib/followup.py (This program loads bot-related code from the library code and then runs a message loop, feeding messages to the library code to handle.) Please make sure you have a current ~/.zuliprc file with the credentials you want to use for this bot. See lib/readme.md for more context. ''' parser = optparse.OptionParser(usage=usage) parser.add_option('--quiet', '-q', action='store_true', help='Turn off logging output.') parser.add_option('--config-file', action='store', help='(alternate config file to ~/.zuliprc)') parser.add_option('--provision', action='store_true', help='Install dependencies for the bot') parser.add_option('--force', action='store_true', help='Try running the bot even if dependencies install fails.') (options, args) = parser.parse_args() if len(args) == 0: print('You must specify a library!') sys.exit(1) bots_fn = args[0] validate_path(bots_fn) if options.provision: print("Provisioning") provision.provision_bot(os.path.dirname(bots_fn), options.force) lib_module = get_lib_module(bots_fn) if not options.quiet: logging.basicConfig(stream=sys.stdout, level=logging.INFO) run_message_handler_for_bot( lib_module=lib_module, config_file=options.config_file, quiet=options.quiet ) if __name__ == '__main__': run()