Made the default_settings file itself detect GAME_DIR, leading to a lot less cookie cutter in the gamedir/server/conf/settings.py file. Refactored the detection algorithm also in the launcher.
This commit is contained in:
parent
9bf09365d2
commit
6782ff1333
4 changed files with 52 additions and 104 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue