diff --git a/evennia/game_template/server/conf/settings.py b/evennia/game_template/server/conf/settings.py index b2cb4274b..577639844 100644 --- a/evennia/game_template/server/conf/settings.py +++ b/evennia/game_template/server/conf/settings.py @@ -1,18 +1,27 @@ """ Evennia settings file. -The full options are found in the default settings file found here: +The available options are found in the default settings file found +here: {settings_default} -Note: Don't copy more from the default file than you actually intend to +Remember: + +Don't copy more from the default file than you actually intend to change; this will make sure that you don't overload upstream updates unnecessarily. +When changing a setting requiring a file system path (like +path/to/actual/file.py), use GAME_DIR and EVENNIA_DIR to reference +your game folder and the Evennia library folders respectively. Python +paths (path.to.module) should be given relative to the game's root +folder (typeclasses.foo) whereas paths within the Evennia library +needs to be given explicitly (evennia.foo). + """ # Use the defaults from Evennia unless explicitly overridden -import os from evennia.settings_default import * ###################################################################### @@ -22,91 +31,10 @@ from evennia.settings_default import * # This is the name of your game. Make it catchy! SERVERNAME = {servername} -# Path to the game directory (use EVENNIA_DIR to refer to the -# core evennia library) -GAME_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -# Place to put log files -LOG_DIR = os.path.join(GAME_DIR, "server", "logs") -SERVER_LOG_FILE = os.path.join(LOG_DIR, 'server.log') -PORTAL_LOG_FILE = os.path.join(LOG_DIR, 'portal.log') -HTTP_LOG_FILE = os.path.join(LOG_DIR, 'http_requests.log') - -# Other defaults -PROTOTYPE_MODULES = ("world.prototypes",) - -###################################################################### -# Evennia Database config -###################################################################### - -# Database config syntax: -# ENGINE - path to the the database backend. Possible choices are: -# 'django.db.backends.sqlite3', (default) -# 'django.db.backends.mysql', -# 'django.db.backends.postgresql_psycopg2', -# 'django.db.backends.oracle' (untested). -# NAME - database name, or path to the db file for sqlite3 -# USER - db admin (unused in sqlite3) -# PASSWORD - db admin password (unused in sqlite3) -# HOST - empty string is localhost (unused in sqlite3) -# PORT - empty string defaults to localhost (unused in sqlite3) -DATABASES = {{ - 'default': {{ - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(GAME_DIR, "server", "evennia.db3"), - 'USER': '', - 'PASSWORD': '', - 'HOST': '', - 'PORT': '' - }}}} - ###################################################################### # Django web features -# (don't remove these entries, they are needed to override the default -# locations with your actual GAME_DIR locations at run-time) ###################################################################### -# Absolute path to the directory that holds file uploads from web apps. -# Example: "/home/media/media.lawrence.com" -MEDIA_ROOT = os.path.join(GAME_DIR, "web", "media") - -# The master urlconf file that contains all of the sub-branches to the -# applications. Change this to add your own URLs to the website. -ROOT_URLCONF = 'web.urls' - -# URL prefix for admin media -- CSS, JavaScript and images. Make sure -# to use a trailing slash. Django1.4+ will look for admin files under -# STATIC_URL/admin. -STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(GAME_DIR, "web", "static") - -# Directories from which static files will be gathered from. -STATICFILES_DIRS = ( - os.path.join(GAME_DIR, "web", "static_overrides"), - os.path.join(EVENNIA_DIR, "web", "website", "static"),) - -# We setup the location of the website template as well as the admin site. -TEMPLATES = [{ - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [ - os.path.join(GAME_DIR, "web", "template_overrides", WEBSITE_TEMPLATE), - os.path.join(GAME_DIR, "web", "template_overrides", WEBCLIENT_TEMPLATE), - os.path.join(GAME_DIR, "web", "template_overrides"), - os.path.join(EVENNIA_DIR, "web", "website", "templates", WEBSITE_TEMPLATE), - os.path.join(EVENNIA_DIR, "web", "website", "templates"), - os.path.join(EVENNIA_DIR, "web", "webclient", "templates", WEBCLIENT_TEMPLATE), - os.path.join(EVENNIA_DIR, "web", "webclient", "templates")], - 'APP_DIRS': True, - 'OPTIONS': { - "context_processors": [ - 'django.template.context_processors.i18n', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.template.context_processors.media', - 'django.template.context_processors.debug', - 'evennia.web.utils.general_context.general_context'] - } - }] # The secret key is randomly seeded upon creation. It is used to sign # Django's cookies. Do not share this with anyone. Changing it will diff --git a/evennia/server/evennia_launcher.py b/evennia/server/evennia_launcher.py index 6d6b456c4..b7bb711b8 100644 --- a/evennia/server/evennia_launcher.py +++ b/evennia/server/evennia_launcher.py @@ -19,7 +19,6 @@ import shutil import importlib from argparse import ArgumentParser from subprocess import Popen, check_output, call, CalledProcessError, STDOUT -import twisted import django # Signal processing @@ -421,24 +420,19 @@ def set_gamedir(path): is inside the directory tree. """ - global GAMEDIR - if os.path.exists(os.path.join(path, SETTINGS_PATH)): - # path at root of game dir - GAMEDIR = os.path.abspath(path) - elif os.path.exists(os.path.join(path, os.path.pardir, SETTINGS_PATH)): - # path given to somewhere one level down - GAMEDIR = os.path.dirname(path) - elif os.path.exists(os.path.join(path, os.path.pardir, os.path.pardir, SETTINGS_PATH)): - # path given to somwhere two levels down - GAMEDIR = os.path.dirname(os.path.dirname(path)) - elif os.path.exists(os.path.join(path, os.path.pardir, os.path. pardir, os.path.pardir, SETTINGS_PATH)): - # path given to somewhere three levels down (custom directories) - GAMEDIR = os.path.dirname(os.path.dirname(os.path.dirname(path))) - else: - # we don't look further down than this ... - print(ERROR_NO_GAMEDIR) - sys.exit() + + Ndepth = 10 + settings_path = os.path.join("server", "conf", "settings.py") + for i in range(Ndepth): + gpath = os.getcwd() + if "server" in os.listdir(gpath): + if os.path.isfile(settings_path): + GAMEDIR = gpath + return + os.chdir(os.pardir) + print(ERROR_NO_GAMEDIR) + sys.exit() def create_secret_key(): @@ -471,7 +465,6 @@ def create_settings_file(): "servername": "\"%s\"" % GAMEDIR.rsplit(os.path.sep, 1)[1].capitalize(), "secret_key": "\'%s\'" % create_secret_key()} - # modify the settings settings_string = settings_string.format(**setting_dict) with open(settings_path, 'w') as f: diff --git a/evennia/settings_default.py b/evennia/settings_default.py index 6733440c7..e8e7bd5f8 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -103,13 +103,21 @@ WEBSOCKET_INTERFACES = ['0.0.0.0'] EVENNIA_ADMIN = True # Path to the lib directory containing the bulk of the codebase's code. EVENNIA_DIR = os.path.dirname(os.path.abspath(__file__)) -# Path to the game directory (containing the database file if using sqlite). +# Path to the game directory (containing the server/conf/settings.py file) +# This is dynamically created- there is generally no need to change this! if sys.argv[1] == 'test' if len(sys.argv)>1 else False: # unittesting mode GAME_DIR = os.getcwd() else: # Fallback location (will be replaced by the actual game dir at runtime) GAME_DIR = os.path.join(EVENNIA_DIR, 'game_template') + for i in range(10): + gpath = os.getcwd() + if "server" in os.listdir(gpath): + if os.path.isfile(os.path.join("server", "conf", "settings.py")): + GAME_DIR = gpath + break + os.chdir(os.pardir) # Place to put log files LOG_DIR = os.path.join(GAME_DIR, 'server', 'logs') diff --git a/evennia/utils/utils.py b/evennia/utils/utils.py index 4e79bd107..25f95c776 100644 --- a/evennia/utils/utils.py +++ b/evennia/utils/utils.py @@ -1605,3 +1605,22 @@ class LimitedSizeOrderedDict(OrderedDict): def update(self, *args, **kwargs): super(LimitedSizeOrderedDict, self).update(*args, **kwargs) self._check_size() + +def get_game_dir_path(): + """ + This is called by settings_default in order to determine the path + of the game directory. + + Returns: + path (str): Full OS path to the game dir + + """ + # current working directory, assumed to be somewhere inside gamedir. + for i in range(10): + gpath = os.getcwd() + if "server" in os.listdir(gpath): + if os.path.isfile(os.path.join("server", "conf", "settings.py")): + return gpath + else: + os.chdir(os.pardir) + raise RuntimeError("server/conf/settings.py not found: Must start from inside game dir.")