import argparse import sys from . import handlers def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog="xray-manager") subparsers = parser.add_subparsers(dest="group", required=True) # ---------- user ---------- user_parser = subparsers.add_parser("user") user_subparser = user_parser.add_subparsers(dest="command", required=True) # user add user_add_parser = user_subparser.add_parser("add") user_add_parser.add_argument("username") user_add_parser.add_argument( "-c", "--connection", nargs="+", default=[], help="Connections to add, e.g. shadowsocks:ru1 vless:us1", ) user_add_parser.set_defaults(handler=handlers.user_add) # user show user_show_parser = user_subparser.add_parser("show") user_show_parser.add_argument("username", nargs="?") user_show_parser.add_argument("-a", "--all", action="store_true") user_show_parser.set_defaults(handler=handlers.user_show) # user modify user_modify_parser = user_subparser.add_parser("modify") user_modify_parser.add_argument("username") user_modify_parser.add_argument( "-a", "--add", dest="to_add", nargs="+", default=[], metavar="SPEC", help="Connections to add", ) user_modify_parser.add_argument( "-d", "--delete", dest="to_delete", nargs="+", default=[], metavar="SPEC", help="Connections to delete", ) user_modify_parser.set_defaults(handler=handlers.user_modify) # user delete user_delete_parser = user_subparser.add_parser("delete") group = user_delete_parser.add_mutually_exclusive_group(required=True) group.add_argument("username", nargs="?") group.add_argument("-a", "--all", action="store_true") user_delete_parser.set_defaults(handler=handlers.user_delete) # -------- profile --------- profile_parser = subparsers.add_parser("profile") profile_subparser = profile_parser.add_subparsers( dest="command", required=True ) # profile build profile_build_parser = profile_subparser.add_parser("build") group = profile_build_parser.add_mutually_exclusive_group(required=True) group.add_argument("username", nargs="?") group.add_argument("-a", "--all", action="store_true") profile_build_parser.set_defaults(handler=handlers.profile_build) # profile show profile_show_parser = profile_subparser.add_parser("show") group = profile_show_parser.add_mutually_exclusive_group(required=True) group.add_argument("username", nargs="?") group.add_argument("-a", "--all", action="store_true") profile_show_parser.set_defaults(handler=handlers.profile_show) # profile clear profile_clear_parser = profile_subparser.add_parser("clear") group = profile_clear_parser.add_mutually_exclusive_group(required=True) group.add_argument("username", nargs="?") group.add_argument("-a", "--all", action="store_true") profile_clear_parser.set_defaults(handler=handlers.profile_clear) # profile delete profile_delete_parser = profile_subparser.add_parser("delete") group = profile_delete_parser.add_mutually_exclusive_group(required=True) group.add_argument("username", nargs="?") group.add_argument("-a", "--all", action="store_true") profile_delete_parser.set_defaults(handler=handlers.profile_delete) # profile qrcode profile_qrcode_parser = profile_subparser.add_parser("qrcode") group = profile_qrcode_parser.add_mutually_exclusive_group(required=True) group.add_argument("username", nargs="?") group.add_argument("-a", "--all", action="store_true") profile_qrcode_parser.set_defaults(handler=handlers.profile_qrcode) return parser def main(): parser = build_parser() try: args = parser.parse_args() func = args.handler kwargs = vars(args) kwargs.pop("handler") func(**kwargs) except ValueError as e: print(e, file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()