#!/usr/bin/env python import sys import os from copy import deepcopy from pathlib import Path import appdirs from redbot.core.json_io import JsonIO from redbot.core.data_manager import basic_config_default from redbot.core.cli import confirm config_dir = None appdir = appdirs.AppDirs("Red-DiscordBot") if sys.platform == 'linux': if 0 < os.getuid() < 1000: config_dir = Path(appdir.site_data_dir) if not config_dir: config_dir = Path(appdir.user_config_dir) try: config_dir.mkdir(parents=True, exist_ok=True) except PermissionError: print( "You don't have permission to write to " "'{}'\nExiting...".format(config_dir)) sys.exit(1) config_file = config_dir / 'config.json' def load_existing_config(): if not config_file.exists(): return {} return JsonIO(config_file)._load_json() def save_config(name, data): config = load_existing_config() config[name] = data JsonIO(config_file)._save_json(config) def basic_setup(): """ Creates the data storage folder. :return: """ default_data_dir = Path(appdir.user_data_dir) print("Hello! Before we begin the full configuration process we need to" " gather some initial information about where you'd like us" " to store your bot's data. We've attempted to figure out a" " sane default data location which is printed below. If you don't" " want to change this default please press [ENTER], otherwise" " input your desired data location.") print() print("Default: {}".format(default_data_dir)) new_path = input('> ') if new_path != '': new_path = Path(new_path) default_data_dir = new_path if not default_data_dir.exists(): try: default_data_dir.mkdir(parents=True, exist_ok=True) except OSError: print("We were unable to create your chosen directory." " You may need to restart this process with admin" " privileges.") sys.exit(1) print("You have chosen {} to be your data directory." "".format(default_data_dir)) if not confirm("Please confirm (y/n):"): print("Please start the process over.") sys.exit(0) default_dirs = deepcopy(basic_config_default) default_dirs['DATA_PATH'] = str(default_data_dir.resolve()) storage_dict = { 1: "JSON", 2: "MongoDB" } storage = None while storage is None: print() print("Please choose your storage backend (if you're unsure, choose 1).") print("1. JSON (file storage, requires no database).") print("2. MongoDB") storage = input("> ") try: storage = int(storage) except ValueError: storage = None else: if storage not in storage_dict: storage = None default_dirs['STORAGE_TYPE'] = storage_dict.get(storage, 1) if storage_dict.get(storage, 1) == "MongoDB": from redbot.core.drivers.red_mongo import get_config_details default_dirs['STORAGE_DETAILS'] = get_config_details() else: default_dirs['STORAGE_DETAILS'] = {} name = "" while len(name) == 0: print() print("Please enter a name for your instance, this name cannot include spaces" " and it will be used to run your bot from here on out.") name = input("> ") if " " in name: name = "" save_config(name, default_dirs) print() print("Your basic configuration has been saved. Please run `redbot ` to" " continue your setup process and to run the bot.")