Make console work

This commit is contained in:
Robert Miles 2018-06-25 18:01:54 -04:00
parent 3636c30199
commit 6030215c03
1 changed files with 103 additions and 2 deletions

View File

@ -1,2 +1,103 @@
def main():
return
## @package teambot.console
#
# The source of the `teambot` tool. Automatically creates a teambot class.
import sys, argparse
## A basic teambot bot.py file.
#
# Used for "teambot new".
BASE_BOT_PY = """import teambot
class {classname}(teambot.Handler{mixin}):
{code}
if __name__=="__main__":
{indent}channels = "{channels}".split()
{indent}bot = teambot.TeamBot(channels,"{nick}","{server}",chandler={classname})
{indent}bot.start()
"""
## The code for the base handler class.
#
# Defines on_pubmsg and on_privmsg functions.
BASE_HANDLER_CODE = """{indent}def on_pubmsg(self,channel,nick,text):
{indent}{indent}pass # change this
{indent}def on_privmsg(self,nick,text):
{indent}{indent}pass # change this"""
## The code for the command mixin handler class.
#
# Defines the handle_command function.
BASE_MIXIN_CODE = """{indent}def handle_command(self,target,nick,text):
{indent}{indent}pass # change this"""
## Prompts user for value. Returns default if user supplies no response.
#
# @param ps The prompt string.
# @param default Default value to return on no input. Defaults to None
def prompt(ps,default=None):
if default is not None:
ps = "{} [{}]: ".format(ps,default)
else:
ps = "{}: ".format(ps)
ret = input(ps)
if not ret:
return default
return ret
## Verifies #prompt output to be in a collection.
#
# @param ps The prompt string
# @param answers The acceptable answers
# @param default The default value to return.
# @param loop Whether this command should loop until correct output is recieved. Defaults to True.
def prompt_verify(ps,answers,default=None,loop=True):
ret = prompt(ps,default)
if ret not in answers:
if loop:
print("Invalid response \"{}\"!".format(ret))
return prompt_verify(ps,answers,default,loop)
else:
return default
return ret
## The different kinds of indentation supported for automatic creation.
#
INDENTATION = {"tabs":"\t","quadspace":" ","doublespace":" "}
## Creates a new bot.
#
# This function is invoked for `teambot new`.
# @param args The args namespace, as returned by argparse.ArgumentParser.parse_args.
def cli_new(args):
classname = prompt("Class name?","BotHandler")
indent = INDENTATION[prompt_verify("Indentation? ({})".format(", ".join(x for x in INDENTATION.keys())),list(INDENTATION.keys()),default="tabs")]
mixin = prompt("Use command handler mixin (all commands, privmsg or pubmsg, go to the same function, yes/no)?","yes")
mixin = ",teambot.CommandHandlerMixin" if mixin[0].lower()=="y" else ""
code = BASE_HANDLER_CODE.format(indent=indent) if len(mixin)==0 else BASE_MIXIN_CODE.format(indent=indent)
nick = prompt("Bot nick?")
while nick is None:
print("Bot nick is required!")
nick = prompt("Bot nick?")
server = prompt("Server to connect to?","localhost")
channels = prompt("Channels to join? (space seperated)","#bots")
with open("bot.py","w") as f:
f.write(BASE_BOT_PY.format(**locals()))
## The possible operations and what functions to call.
OPERATIONS = {"new": cli_new}
## The source code for the `teambot` tool.
#
# To be specific, this function parses the arguments and delegates to seperate functions for the operations.
def main(gargs=None):
if gargs is None:
gargs = sys.argv
parser = argparse.ArgumentParser(prog="teambot",description="A tool for making IRC bots with teambot.")
parser.add_argument("operation",help="The operation to do. Valid operations: {}".format(", ".join(x for x in OPERATIONS.keys())))
parser.add_argument("args",nargs="*")
args = parser.parse_args(gargs)
if args.operation not in OPERATIONS:
parser.error("invalid operation \"{}\"".format(args.operation))
OPERATIONS[args.operation](args)