diff --git a/src/config/fixtures/initial_data.json b/src/config/fixtures/initial_data.json deleted file mode 100644 index fa98833340..0000000000 --- a/src/config/fixtures/initial_data.json +++ /dev/null @@ -1 +0,0 @@ -[{"pk": 1, "model": "config.connectscreen", "fields": {"is_active": 1, "name": "Default", "connect_screen_text": "%ch%cb==================================================================%cn\r\n Welcome to Evennia! Please type one of the following to begin:\r\n\r\n If you have an existing account, connect to it by typing:\r\n %chconnect %cn\r\n If you need to create an account, type (without the <>'s):\r\n %chcreate \"\" %cn\r\n%ch%cb==================================================================%cn\r\n"}}, {"pk": 9, "model": "config.commandalias", "fields": {"user_input": "@desc", "equiv_command": "@describe"}}, {"pk": 3, "model": "config.commandalias", "fields": {"user_input": "@dest", "equiv_command": "@destroy"}}, {"pk": 4, "model": "config.commandalias", "fields": {"user_input": "@nuke", "equiv_command": "@destroy"}}, {"pk": 6, "model": "config.commandalias", "fields": {"user_input": "@tel", "equiv_command": "@teleport"}}, {"pk": 2, "model": "config.commandalias", "fields": {"user_input": "ex", "equiv_command": "examine"}}, {"pk": 7, "model": "config.commandalias", "fields": {"user_input": "i", "equiv_command": "inventory"}}, {"pk": 8, "model": "config.commandalias", "fields": {"user_input": "inv", "equiv_command": "inventory"}}, {"pk": 1, "model": "config.commandalias", "fields": {"user_input": "l", "equiv_command": "look"}}, {"pk": 5, "model": "config.commandalias", "fields": {"user_input": "sa", "equiv_command": "say"}}, {"pk": 1, "model": "config.configvalue", "fields": {"conf_value": "Evennia Test Site", "conf_key": "site_name"}}, {"pk": 2, "model": "config.configvalue", "fields": {"conf_value": "2", "conf_key": "player_dbnum_start"}}, {"pk": 3, "model": "config.configvalue", "fields": {"conf_value": "Credits", "conf_key": "money_name_plural"}}, {"pk": 4, "model": "config.configvalue", "fields": {"conf_value": "Credit", "conf_key": "money_name_singular"}}, {"pk": 5, "model": "config.configvalue", "fields": {"conf_value": "1", "conf_key": "game_firstrun"}}, {"pk": 6, "model": "config.configvalue", "fields": {"conf_value": "1800", "conf_key": "idle_timeout"}}, {"pk": 7, "model": "config.configvalue", "fields": {"conf_value": "2", "conf_key": "default_home"}}] diff --git a/src/config/managers/configvalue.py b/src/config/managers/configvalue.py index 1a3413c2bd..ed6e7a0c6d 100644 --- a/src/config/managers/configvalue.py +++ b/src/config/managers/configvalue.py @@ -1,7 +1,6 @@ """ Custom manager for ConfigValue objects. """ -from traceback import format_exc from django.db import models from src import logger @@ -13,8 +12,9 @@ class ConfigValueManager(models.Manager): try: return self.get(conf_key__iexact=configname).conf_value except self.model.DoesNotExist: - logger.log_errmsg("Unable to get config value for %s (does not exist):\n%s" % ( - configname, (format_exc()))) + logger.log_errmsg("Unable to get config value for %s (does not exist).\n" % ( + configname)) + raise def set_configvalue(self, configname, newvalue): """ @@ -29,4 +29,5 @@ class ConfigValueManager(models.Manager): return newvalue except self.model.DoesNotExist: logger.log_errmsg("Unable to set config value for %s (does not exist):\n%s" % ( - configname, (format_exc()))) + configname)) + raise \ No newline at end of file diff --git a/src/config/managers/connectscreen.py b/src/config/managers/connectscreen.py index 2c20ebe7df..1d01bd2a75 100644 --- a/src/config/managers/connectscreen.py +++ b/src/config/managers/connectscreen.py @@ -12,6 +12,7 @@ class ConnectScreenManager(models.Manager): return self.filter(is_active=True).order_by('?')[0] except IndexError: new_screen = ConnectScreen(name='Default', - connect_screen_text='This is a placeholder connect screen. Remind your admin to edit it through the Admin interface.') + text='This is a placeholder connect screen. Remind your admin to edit it through the Admin interface.', + is_active=True) new_screen.save() return new_screen diff --git a/src/config/models.py b/src/config/models.py index 937bd0c8e5..c322578ec2 100755 --- a/src/config/models.py +++ b/src/config/models.py @@ -44,7 +44,7 @@ class ConnectScreen(models.Model): will cycle randomly. """ name = models.CharField(max_length=255, help_text="An optional name for this screen (for organizational purposes).", blank=True) - connect_screen_text = models.TextField(help_text="The text for the connect screen. Color codes and substitutions are evaluated.") + text = models.TextField(help_text="The text for the connect screen. Color codes and substitutions are evaluated.") is_active = models.BooleanField(default=1, help_text="Only active connect screens are placed in the rotation") objects = ConnectScreenManager() diff --git a/src/initial_setup.py b/src/initial_setup.py index bdebec5d3d..7227c26432 100644 --- a/src/initial_setup.py +++ b/src/initial_setup.py @@ -1,35 +1,121 @@ +""" +This module handles initial database propagation, which is only ran the first +time the game starts. It will create some default channels, objects, and +other things. + +Everything starts at handle_setup() +""" from django.contrib.auth.models import User, Group +from django.core import management from src.objects.models import Object -from src.config.models import ConfigValue +from src.config.models import ConfigValue, CommandAlias, ConnectScreen from src import comsys, defines_global -def handle_setup(): - # Set the initial user's username on the #1 object. - god_user = User.objects.get(id=1) +def get_god_user(): + """ + Returns the initially created 'god' User object. + """ + return User.objects.get(id=1) + +def get_god_obj(): + """ + Returns the initially created 'god' user's PLAYER object. + """ + return Object.objects.get(id=1) + +def create_objects(): + """ + Creates the #1 player and Limbo room. + """ + # Set the initial User's account object's username on the #1 object. + god_user = get_god_user() + # Create the matching PLAYER object in the object DB. god_user_obj = Object(id=1, type=defines_global.OTYPE_PLAYER) god_user_obj.set_name(god_user.username) god_user_obj.save() - limbo_obj = Object() - limbo_obj.type = defines_global.OTYPE_ROOM - limbo_obj.owner = god_user_obj - limbo_obj.set_name('Limbo') + # Limbo is the initial starting room. + limbo_obj = Object(type = defines_global.OTYPE_ROOM) + limbo_obj.set_owner(god_user_obj) + limbo_obj.set_name('%ch%ccLimbo%cn') + limbo_obj.set_description("Welcome to your new Evennia-based game. From here you are ready to begin development. If you should need help or would like to participate in community discussions, visit http://evennia.com.") limbo_obj.save() - - god_user_obj.home = limbo_obj - god_user_obj.save() + # Now that Limbo exists, set the user up in Limbo. + god_user_obj.location = limbo_obj + god_user_obj.set_home(limbo_obj) + +def create_groups(): + """ + Creates the default permissions groups. + """ groups = ("Immortals", "Wizards", "Builders", "Player Helpers") for group in groups: newgroup = Group() newgroup.name = group newgroup.save() - + +def create_channels(): + """ + Creates some sensible default channels. + """ + god_user_obj = get_god_obj() chan_pub = comsys.create_channel("Public", god_user_obj, description="Public Discussion") chan_pub.is_joined_by_default = True chan_pub.save() comsys.create_channel("Errors", god_user_obj, description="Error log") comsys.create_channel("Info", god_user_obj, description="Informative messages") - + +def create_config_values(): + """ + Creates the initial config values. + """ + ConfigValue(conf_key="default_home", conf_value="2").save() + ConfigValue(conf_key="idle_timeout", conf_value="1800").save() + ConfigValue(conf_key="money_name_singular", conf_value="Credit").save() + ConfigValue(conf_key="money_name_plural", conf_value="Credits").save() + ConfigValue(conf_key="player_dbnum_start", conf_value="2").save() + ConfigValue(conf_key="site_name", conf_value="Evennia Test Site").save() # We don't want to do initial setup tasks every startup, only the first. - ConfigValue.objects.set_configvalue('game_firstrun', '0') + ConfigValue(conf_key="game_firstrun", conf_value="0").save() + +def create_connect_screens(): + """ + Creates the default connect screen(s). + """ + ConnectScreen(name="Default", + text="%ch%cb==================================================================%cn\r\n Welcome to Evennia! Please type one of the following to begin:\r\n\r\n If you have an existing account, connect to it by typing:\r\n %chconnect %cn\r\n If you need to create an account, type (without the <>'s):\r\n %chcreate \"\" %cn\r\n%ch%cb==================================================================%cn\r\n", + is_active=True).save() + +def create_aliases(): + """ + Populates the standard aliases. + """ + CommandAlias(user_input="@desc", equiv_command="@describe").save() + CommandAlias(user_input="@dest", equiv_command="@destroy").save() + CommandAlias(user_input="@nuke", equiv_command="@destroy").save() + CommandAlias(user_input="@tel", equiv_command="@teleport").save() + CommandAlias(user_input="i", equiv_command="inventory").save() + CommandAlias(user_input="inv", equiv_command="inventory").save() + CommandAlias(user_input="l", equiv_command="look").save() + CommandAlias(user_input="ex", equiv_command="examine").save() + CommandAlias(user_input="sa", equiv_command="say").save() + CommandAlias(user_input="emote", equiv_command="pose").save() + +def import_help_files(): + """ + Imports the help files. + """ + management.call_command('loaddata', '../docs/help_files.json', verbosity=0) + +def handle_setup(): + """ + Main logic for the module. + """ + create_config_values() + create_aliases() + create_connect_screens() + create_objects() + create_groups() + create_channels() + import_help_files() diff --git a/src/objects/sql/object.sql b/src/objects/sql/object.sql deleted file mode 100644 index 23d2e75fb6..0000000000 --- a/src/objects/sql/object.sql +++ /dev/null @@ -1,5 +0,0 @@ -INSERT INTO objects_object VALUES(1,'Wizard','Wizard',1,0,'',2,1,'',2,'','CONNECTED','2007-04-25'); -INSERT INTO objects_object VALUES(2,'Limbo','Limbo',1,NULL,'',NULL,2,'Welcome to your new Evennia-based game. From here you are ready to begin development. If you should need help or would like to participate in community discussions, visit http://evennia.com.',NULL,'','','2007-04-25'); -INSERT INTO objects_commchannel VALUES(1,'Public','Public',1,'Public Discussion', false); -INSERT INTO objects_commchannel VALUES(2,'Errors','Errors',1,'Error Log', false); -INSERT INTO objects_commchannel VALUES(3,'Info','Info',1,'Info Log', false); diff --git a/src/server.py b/src/server.py index db30732bfe..ded97ad37f 100755 --- a/src/server.py +++ b/src/server.py @@ -1,14 +1,9 @@ -from traceback import format_exc import time import sys - from twisted.application import internet, service from twisted.internet import protocol, reactor, defer - -from django.db import models from django.db import connection from django.conf import settings - from src.config.models import CommandAlias, ConfigValue from src.session import SessionProtocol from src import scheduler @@ -19,8 +14,8 @@ from src import initial_setup from src.util import functions_general class EvenniaService(service.Service): - - def __init__(self, filename="blah"): + def __init__(self): + # This holds a dictionary of command aliases for cmdhandler.py self.cmd_alias_list = {} self.game_running = True sys.path.append('.') @@ -33,14 +28,18 @@ class EvenniaService(service.Service): cursor = connection.cursor() cursor.execute("UPDATE objects_object SET nosave_flags=''") + # Begin startup debug output. print '-'*50 - # Load command aliases into memory for easy/quick access. - self.load_cmd_aliases() - if ConfigValue.objects.get_configvalue('game_firstrun') == '1': + try: + # If this fails, this is an empty DB that needs populating. + ConfigValue.objects.get_configvalue('game_firstrun') + except ConfigValue.DoesNotExist: print ' Game started for the first time, setting defaults.' initial_setup.handle_setup() + # Load command aliases into memory for easy/quick access. + self.load_cmd_aliases() self.start_time = time.time() print ' %s started on port(s):' % (ConfigValue.objects.get_configvalue('site_name'),) @@ -114,7 +113,7 @@ class EvenniaService(service.Service): """ application = service.Application('Evennia') -mud_service = EvenniaService('Evennia Server') +mud_service = EvenniaService() # Sheet sheet, fire ze missiles! serviceCollection = service.IServiceCollection(application) diff --git a/src/session.py b/src/session.py index d04d435f20..20f6d713db 100755 --- a/src/session.py +++ b/src/session.py @@ -141,7 +141,7 @@ class SessionProtocol(StatefulTelnetProtocol): Show the banner screen. Grab from the 'connect_screen' config directive. """ screen = ConnectScreen.objects.get_random_connect_screen() - buffer = ansi.parse_ansi(screen.connect_screen_text) + buffer = ansi.parse_ansi(screen.text) self.msg(buffer) def is_loggedin(self):