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.
|
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}
|
{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
|
change; this will make sure that you don't overload upstream updates
|
||||||
unnecessarily.
|
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
|
# Use the defaults from Evennia unless explicitly overridden
|
||||||
import os
|
|
||||||
from evennia.settings_default import *
|
from evennia.settings_default import *
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
@ -22,91 +31,10 @@ from evennia.settings_default import *
|
||||||
# This is the name of your game. Make it catchy!
|
# This is the name of your game. Make it catchy!
|
||||||
SERVERNAME = {servername}
|
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
|
# 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
|
# 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
|
# Django's cookies. Do not share this with anyone. Changing it will
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ import shutil
|
||||||
import importlib
|
import importlib
|
||||||
from argparse import ArgumentParser
|
from argparse import ArgumentParser
|
||||||
from subprocess import Popen, check_output, call, CalledProcessError, STDOUT
|
from subprocess import Popen, check_output, call, CalledProcessError, STDOUT
|
||||||
import twisted
|
|
||||||
import django
|
import django
|
||||||
|
|
||||||
# Signal processing
|
# Signal processing
|
||||||
|
|
@ -421,24 +420,19 @@ def set_gamedir(path):
|
||||||
is inside the directory tree.
|
is inside the directory tree.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global GAMEDIR
|
global GAMEDIR
|
||||||
if os.path.exists(os.path.join(path, SETTINGS_PATH)):
|
|
||||||
# path at root of game dir
|
Ndepth = 10
|
||||||
GAMEDIR = os.path.abspath(path)
|
settings_path = os.path.join("server", "conf", "settings.py")
|
||||||
elif os.path.exists(os.path.join(path, os.path.pardir, SETTINGS_PATH)):
|
for i in range(Ndepth):
|
||||||
# path given to somewhere one level down
|
gpath = os.getcwd()
|
||||||
GAMEDIR = os.path.dirname(path)
|
if "server" in os.listdir(gpath):
|
||||||
elif os.path.exists(os.path.join(path, os.path.pardir, os.path.pardir, SETTINGS_PATH)):
|
if os.path.isfile(settings_path):
|
||||||
# path given to somwhere two levels down
|
GAMEDIR = gpath
|
||||||
GAMEDIR = os.path.dirname(os.path.dirname(path))
|
return
|
||||||
elif os.path.exists(os.path.join(path, os.path.pardir, os.path. pardir, os.path.pardir, SETTINGS_PATH)):
|
os.chdir(os.pardir)
|
||||||
# path given to somewhere three levels down (custom directories)
|
print(ERROR_NO_GAMEDIR)
|
||||||
GAMEDIR = os.path.dirname(os.path.dirname(os.path.dirname(path)))
|
sys.exit()
|
||||||
else:
|
|
||||||
# we don't look further down than this ...
|
|
||||||
print(ERROR_NO_GAMEDIR)
|
|
||||||
sys.exit()
|
|
||||||
|
|
||||||
|
|
||||||
def create_secret_key():
|
def create_secret_key():
|
||||||
|
|
@ -471,7 +465,6 @@ def create_settings_file():
|
||||||
"servername": "\"%s\"" % GAMEDIR.rsplit(os.path.sep, 1)[1].capitalize(),
|
"servername": "\"%s\"" % GAMEDIR.rsplit(os.path.sep, 1)[1].capitalize(),
|
||||||
"secret_key": "\'%s\'" % create_secret_key()}
|
"secret_key": "\'%s\'" % create_secret_key()}
|
||||||
|
|
||||||
# modify the settings
|
|
||||||
settings_string = settings_string.format(**setting_dict)
|
settings_string = settings_string.format(**setting_dict)
|
||||||
|
|
||||||
with open(settings_path, 'w') as f:
|
with open(settings_path, 'w') as f:
|
||||||
|
|
|
||||||
|
|
@ -103,13 +103,21 @@ WEBSOCKET_INTERFACES = ['0.0.0.0']
|
||||||
EVENNIA_ADMIN = True
|
EVENNIA_ADMIN = True
|
||||||
# Path to the lib directory containing the bulk of the codebase's code.
|
# Path to the lib directory containing the bulk of the codebase's code.
|
||||||
EVENNIA_DIR = os.path.dirname(os.path.abspath(__file__))
|
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:
|
if sys.argv[1] == 'test' if len(sys.argv)>1 else False:
|
||||||
# unittesting mode
|
# unittesting mode
|
||||||
GAME_DIR = os.getcwd()
|
GAME_DIR = os.getcwd()
|
||||||
else:
|
else:
|
||||||
# Fallback location (will be replaced by the actual game dir at runtime)
|
# Fallback location (will be replaced by the actual game dir at runtime)
|
||||||
GAME_DIR = os.path.join(EVENNIA_DIR, 'game_template')
|
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
|
# Place to put log files
|
||||||
LOG_DIR = os.path.join(GAME_DIR, 'server', 'logs')
|
LOG_DIR = os.path.join(GAME_DIR, 'server', 'logs')
|
||||||
|
|
|
||||||
|
|
@ -1605,3 +1605,22 @@ class LimitedSizeOrderedDict(OrderedDict):
|
||||||
def update(self, *args, **kwargs):
|
def update(self, *args, **kwargs):
|
||||||
super(LimitedSizeOrderedDict, self).update(*args, **kwargs)
|
super(LimitedSizeOrderedDict, self).update(*args, **kwargs)
|
||||||
self._check_size()
|
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