_cli.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import argparse
  2. import os
  3. import pathlib
  4. import sys
  5. import yaml
  6. import tooncher
  7. import tooncher.controls
  8. if sys.platform == "darwin":
  9. _TOONTOWN_ENGINE_DEFAULT_PATH = os.path.join(
  10. os.path.expanduser("~"),
  11. "Library",
  12. "Application Support",
  13. "Toontown Rewritten",
  14. "Toontown Rewritten",
  15. )
  16. else:
  17. _TOONTOWN_ENGINE_DEFAULT_PATH = None
  18. def run(
  19. username,
  20. config_path,
  21. engine_path=None,
  22. validate_ssl_certs=True,
  23. cpu_limit_percent=None,
  24. enable_extended_keyboard_controls=False,
  25. extended_keyboard_control_toggle_keysym_name=None,
  26. engine_window_name=None,
  27. ):
  28. if os.path.exists(config_path):
  29. with open(config_path) as config_file:
  30. config = yaml.safe_load(config_file.read())
  31. else:
  32. config = {}
  33. if engine_path is None:
  34. if "engine_path" in config:
  35. engine_path = config["engine_path"]
  36. else:
  37. engine_path = _TOONTOWN_ENGINE_DEFAULT_PATH
  38. if engine_path is None:
  39. raise ValueError(
  40. "missing path to toontown engine\n"
  41. + "pass --engine-path, set $TOONCHER_ENGINE_PATH, or add to config file"
  42. )
  43. accounts = [a for a in config.get("accounts", []) if a["username"] == username]
  44. if not accounts:
  45. raise ValueError("username {!r} was not found in config file".format(username))
  46. if len(accounts) > 1:
  47. raise ValueError(
  48. "multiple entries for username {!r} in config file".format(username)
  49. )
  50. tooncher.launch(
  51. engine_path=pathlib.Path(engine_path),
  52. username=accounts[0]["username"],
  53. password=accounts[0]["password"],
  54. validate_ssl_certs=validate_ssl_certs,
  55. cpu_limit_percent=cpu_limit_percent,
  56. enable_extended_keyboard_controls=enable_extended_keyboard_controls,
  57. extended_keyboard_control_toggle_keysym_name=extended_keyboard_control_toggle_keysym_name,
  58. engine_window_name=engine_window_name,
  59. )
  60. class _EnvDefaultArgparser(argparse.ArgumentParser):
  61. def add_argument(self, *args, envvar=None, **kwargs):
  62. if envvar:
  63. envvar_value = os.environ.get(envvar, None)
  64. if envvar_value:
  65. kwargs["required"] = False
  66. kwargs["default"] = envvar_value
  67. super().add_argument(*args, **kwargs)
  68. def _init_argparser():
  69. argparser = _EnvDefaultArgparser(description=None)
  70. argparser.add_argument("username")
  71. argparser.add_argument(
  72. "--config",
  73. "-c",
  74. metavar="path",
  75. dest="config_path",
  76. help="path to config file (default: %(default)s)",
  77. default=os.path.join(os.path.expanduser("~"), ".tooncher"),
  78. )
  79. argparser.add_argument(
  80. "--engine-path",
  81. "-e",
  82. metavar="path",
  83. dest="engine_path",
  84. envvar="TOONCHER_ENGINE_PATH",
  85. default=None,
  86. help="path to toontown engine (overrides path in config file, "
  87. + "may also be set via env var $TOONCHER_ENGINE_PATH)",
  88. )
  89. argparser.add_argument(
  90. "--no-ssl-cert-validation",
  91. "-k",
  92. dest="validate_ssl_certs",
  93. help="do not validate ssl certificates",
  94. action="store_false",
  95. )
  96. argparser.add_argument(
  97. "--cpu-limit",
  98. dest="cpu_limit_percent",
  99. type=int,
  100. default=None,
  101. help="maximally allowed cpu usage in percent"
  102. + " (requires cpulimit command, default: %(default)s)",
  103. )
  104. argparser.add_argument(
  105. "--extended-controls",
  106. dest="enable_extended_keyboard_controls",
  107. action="store_true",
  108. help="enable extended keyboard controls"
  109. + ", e.g. walk with WASD"
  110. + " (requires xlib for python, default: %(default)s)",
  111. )
  112. argparser.add_argument(
  113. "--extended-controls-toggle",
  114. metavar="KEYSYM_NAME",
  115. dest="extended_keyboard_control_toggle_keysym_name",
  116. default=tooncher.controls.EXTENDED_CONTROLS_DEFAULT_TOGGLE_KEYSYM_NAME,
  117. help="key to turn extended keyboard controls on / off."
  118. + " any keysym name may be used"
  119. + " (see XStringToKeysym & X11/keysymdef.h, "
  120. + " default: %(default)s)",
  121. )
  122. argparser.add_argument(
  123. "--change-window-name",
  124. metavar="ENGINE_WINDOW_NAME",
  125. dest="engine_window_name",
  126. default=None,
  127. help="Change window name of engine after launch."
  128. + " This requires Extended Controls to be enabled."
  129. + " (default: no change)",
  130. )
  131. return argparser
  132. def main() -> None:
  133. argparser = _init_argparser()
  134. args = argparser.parse_args()
  135. run(**vars(args))