mirror of
https://github.com/Cog-Creators/Red-DiscordBot.git
synced 2026-04-22 02:59:17 -04:00
Reuse name input logic and allow retry in data path input (#6696)
This commit is contained in:
@@ -182,32 +182,10 @@ async def _edit_owner(red, owner, no_prompt):
|
|||||||
|
|
||||||
def _edit_instance_name(old_name, new_name, confirm_overwrite, no_prompt):
|
def _edit_instance_name(old_name, new_name, confirm_overwrite, no_prompt):
|
||||||
if new_name:
|
if new_name:
|
||||||
name = new_name
|
name = get_name(new_name, confirm_overwrite=confirm_overwrite)
|
||||||
if name in _get_instance_names() and not confirm_overwrite:
|
|
||||||
name = old_name
|
|
||||||
print(
|
|
||||||
"An instance with this name already exists.\n"
|
|
||||||
"If you want to remove the existing instance and replace it with this one,"
|
|
||||||
" run this command with --overwrite-existing-instance flag."
|
|
||||||
)
|
|
||||||
elif not no_prompt and confirm("Would you like to change the instance name?", default=False):
|
elif not no_prompt and confirm("Would you like to change the instance name?", default=False):
|
||||||
name = get_name("")
|
name = get_name(confirm_overwrite=confirm_overwrite)
|
||||||
if name in _get_instance_names():
|
print("Instance name updated.\n")
|
||||||
print(
|
|
||||||
"WARNING: An instance already exists with this name. "
|
|
||||||
"Continuing will overwrite the existing instance config."
|
|
||||||
)
|
|
||||||
if not confirm(
|
|
||||||
"Are you absolutely certain you want to continue with this instance name?",
|
|
||||||
default=False,
|
|
||||||
):
|
|
||||||
print("Instance name will remain unchanged.")
|
|
||||||
name = old_name
|
|
||||||
else:
|
|
||||||
print("Instance name updated.")
|
|
||||||
else:
|
|
||||||
print("Instance name updated.")
|
|
||||||
print()
|
|
||||||
else:
|
else:
|
||||||
name = old_name
|
name = old_name
|
||||||
return name
|
return name
|
||||||
|
|||||||
121
redbot/setup.py
121
redbot/setup.py
@@ -61,9 +61,9 @@ def save_config(name, data, remove=False):
|
|||||||
def get_data_dir(*, instance_name: str, data_path: Optional[Path], interactive: bool) -> str:
|
def get_data_dir(*, instance_name: str, data_path: Optional[Path], interactive: bool) -> str:
|
||||||
if data_path is not None:
|
if data_path is not None:
|
||||||
return str(data_path.resolve())
|
return str(data_path.resolve())
|
||||||
data_path = Path(appdir.user_data_dir) / "data" / instance_name
|
default_data_path = Path(appdir.user_data_dir) / "data" / instance_name
|
||||||
if not interactive:
|
if not interactive:
|
||||||
return str(data_path.resolve())
|
return str(default_data_path.resolve())
|
||||||
|
|
||||||
print(
|
print(
|
||||||
"We've attempted to figure out a sane default data location which is printed below."
|
"We've attempted to figure out a sane default data location which is printed below."
|
||||||
@@ -71,37 +71,40 @@ def get_data_dir(*, instance_name: str, data_path: Optional[Path], interactive:
|
|||||||
" otherwise input your desired data location."
|
" otherwise input your desired data location."
|
||||||
)
|
)
|
||||||
print()
|
print()
|
||||||
print("Default: {}".format(data_path))
|
print(f"Default: {default_data_path}")
|
||||||
|
|
||||||
data_path_input = input("> ")
|
while True:
|
||||||
|
data_path_input = input("> ")
|
||||||
|
|
||||||
if data_path_input != "":
|
if data_path_input != "":
|
||||||
data_path = Path(data_path_input)
|
data_path = Path(data_path_input)
|
||||||
|
else:
|
||||||
|
data_path = default_data_path
|
||||||
|
|
||||||
try:
|
|
||||||
exists = data_path.exists()
|
|
||||||
except OSError:
|
|
||||||
print(
|
|
||||||
"We were unable to check your chosen directory."
|
|
||||||
" Provided path may contain an invalid character."
|
|
||||||
)
|
|
||||||
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
|
||||||
|
|
||||||
if not exists:
|
|
||||||
try:
|
try:
|
||||||
data_path.mkdir(parents=True, exist_ok=True)
|
exists = data_path.exists()
|
||||||
except OSError:
|
except OSError:
|
||||||
print(
|
print(
|
||||||
"We were unable to create your chosen directory."
|
"We were unable to check your chosen directory."
|
||||||
" You may need to create the directory and set proper permissions"
|
" Provided path may contain an invalid character."
|
||||||
" for it manually before it can be used as the data directory."
|
|
||||||
)
|
)
|
||||||
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
continue
|
||||||
|
|
||||||
|
if not exists:
|
||||||
|
try:
|
||||||
|
data_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
except OSError:
|
||||||
|
print(
|
||||||
|
"We were unable to create your chosen directory."
|
||||||
|
" You may need to create the directory and set proper permissions"
|
||||||
|
" for it manually before it can be used as the data directory."
|
||||||
|
)
|
||||||
|
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
||||||
|
|
||||||
|
print(f"You have chosen {str(data_path)!r} to be your data directory.")
|
||||||
|
if click.confirm("Please confirm", default=True):
|
||||||
|
break
|
||||||
|
|
||||||
print("You have chosen {} to be your data directory.".format(data_path))
|
|
||||||
if not click.confirm("Please confirm", default=True):
|
|
||||||
print("Please start the process over.")
|
|
||||||
sys.exit(ExitCodes.CRITICAL)
|
|
||||||
return str(data_path.resolve())
|
return str(data_path.resolve())
|
||||||
|
|
||||||
|
|
||||||
@@ -132,18 +135,20 @@ def get_storage_type(backend: Optional[str], *, interactive: bool):
|
|||||||
return storage_dict[storage]
|
return storage_dict[storage]
|
||||||
|
|
||||||
|
|
||||||
def get_name(name: str) -> str:
|
INSTANCE_NAME_RE = re.compile(
|
||||||
INSTANCE_NAME_RE = re.compile(
|
r"""
|
||||||
r"""
|
[a-z0-9] # starts with letter or digit
|
||||||
[a-z0-9] # starts with letter or digit
|
(?:
|
||||||
(?:
|
(?!.*[_\.\-]{2}) # ensure no consecutive dots, hyphens, or underscores
|
||||||
(?!.*[_\.\-]{2}) # ensure no consecutive dots, hyphens, or underscores
|
[a-z0-9_\.\-]* # match allowed characters
|
||||||
[a-z0-9_\.\-]* # match allowed characters
|
[a-z0-9] # ensure string ends with letter or digit
|
||||||
[a-z0-9] # ensure string ends with letter or digit
|
)? # optional to allow strings of length 1
|
||||||
)? # optional to allow strings of length 1
|
""",
|
||||||
""",
|
re.VERBOSE | re.IGNORECASE,
|
||||||
re.VERBOSE | re.IGNORECASE,
|
)
|
||||||
)
|
|
||||||
|
|
||||||
|
def get_name(name: str = "", *, confirm_overwrite: bool = False) -> str:
|
||||||
if name:
|
if name:
|
||||||
if INSTANCE_NAME_RE.fullmatch(name) is None:
|
if INSTANCE_NAME_RE.fullmatch(name) is None:
|
||||||
print(
|
print(
|
||||||
@@ -152,9 +157,17 @@ def get_name(name: str) -> str:
|
|||||||
" and non-consecutive underscores (_) and periods (.)."
|
" and non-consecutive underscores (_) and periods (.)."
|
||||||
)
|
)
|
||||||
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
||||||
|
if name in instance_data and not confirm_overwrite:
|
||||||
|
print(
|
||||||
|
"An instance with this name already exists.\n"
|
||||||
|
"If you want to remove the existing instance and replace it with this one,"
|
||||||
|
" run this command with --overwrite-existing-instance flag."
|
||||||
|
)
|
||||||
|
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
||||||
return name
|
return name
|
||||||
|
|
||||||
while len(name) == 0:
|
name = ""
|
||||||
|
while not name:
|
||||||
print(
|
print(
|
||||||
"Please enter a name for your instance,"
|
"Please enter a name for your instance,"
|
||||||
" it will be used to run your bot from here on out.\n"
|
" it will be used to run your bot from here on out.\n"
|
||||||
@@ -177,6 +190,16 @@ def get_name(name: str) -> str:
|
|||||||
default=False,
|
default=False,
|
||||||
):
|
):
|
||||||
name = ""
|
name = ""
|
||||||
|
elif name in instance_data and not confirm_overwrite:
|
||||||
|
print(
|
||||||
|
"WARNING: An instance already exists with this name."
|
||||||
|
" Continuing will overwrite the existing instance config."
|
||||||
|
)
|
||||||
|
if not click.confirm(
|
||||||
|
"Are you absolutely certain you want to continue with this instance name?",
|
||||||
|
default=False,
|
||||||
|
):
|
||||||
|
name = ""
|
||||||
|
|
||||||
print() # new line for aesthetics
|
print() # new line for aesthetics
|
||||||
return name
|
return name
|
||||||
@@ -206,7 +229,7 @@ def basic_setup(
|
|||||||
"Hello! Before we begin, we need to gather some initial information"
|
"Hello! Before we begin, we need to gather some initial information"
|
||||||
" for the new instance."
|
" for the new instance."
|
||||||
)
|
)
|
||||||
name = get_name(name)
|
name = get_name(name, confirm_overwrite=overwrite_existing_instance)
|
||||||
|
|
||||||
default_data_dir = get_data_dir(
|
default_data_dir = get_data_dir(
|
||||||
instance_name=name, data_path=data_path, interactive=interactive
|
instance_name=name, data_path=data_path, interactive=interactive
|
||||||
@@ -221,26 +244,6 @@ def basic_setup(
|
|||||||
driver_cls = get_driver_class(storage_type)
|
driver_cls = get_driver_class(storage_type)
|
||||||
default_dirs["STORAGE_DETAILS"] = driver_cls.get_config_details()
|
default_dirs["STORAGE_DETAILS"] = driver_cls.get_config_details()
|
||||||
|
|
||||||
if name in instance_data:
|
|
||||||
if overwrite_existing_instance:
|
|
||||||
pass
|
|
||||||
elif interactive:
|
|
||||||
print(
|
|
||||||
"WARNING: An instance already exists with this name. "
|
|
||||||
"Continuing will overwrite the existing instance config."
|
|
||||||
)
|
|
||||||
if not click.confirm(
|
|
||||||
"Are you absolutely certain you want to continue?", default=False
|
|
||||||
):
|
|
||||||
print("Not continuing")
|
|
||||||
sys.exit(ExitCodes.SHUTDOWN)
|
|
||||||
else:
|
|
||||||
print(
|
|
||||||
"An instance with this name already exists.\n"
|
|
||||||
"If you want to remove the existing instance and replace it with this one,"
|
|
||||||
" run this command with --overwrite-existing-instance flag."
|
|
||||||
)
|
|
||||||
sys.exit(ExitCodes.INVALID_CLI_USAGE)
|
|
||||||
save_config(name, default_dirs)
|
save_config(name, default_dirs)
|
||||||
|
|
||||||
if interactive:
|
if interactive:
|
||||||
|
|||||||
Reference in New Issue
Block a user