From 0c9bf08c5abc6ac7ddec15d9f406c358c104c060 Mon Sep 17 00:00:00 2001 From: Griatch Date: Thu, 8 Jan 2015 01:25:32 +0100 Subject: [PATCH] Refactored and fixed a lot of bugs. Creates the database but still does not properly load the settings file. --- bin/evennia.py | 8 +- evennia/__init__.py | 159 +++++++++++------- evennia/commands/default/building.py | 2 +- evennia/commands/default/player.py | 1 + evennia/commands/default/tests.py | 2 +- evennia/players/bots.py | 2 +- evennia/players/{player.py => players.py} | 8 +- evennia/settings_default.py | 14 +- evennia/utils/search.py | 9 +- .../{character.py => characters.py} | 0 .../typeclasses/{exit.py => exits.py} | 0 .../typeclasses/{object.py => objects.py} | 0 .../typeclasses/{player.py => players.py} | 25 ++- .../typeclasses/{room.py => rooms.py} | 0 .../typeclasses/{script.py => scripts.py} | 0 15 files changed, 150 insertions(+), 80 deletions(-) rename evennia/players/{player.py => players.py} (99%) rename game_template/typeclasses/{character.py => characters.py} (100%) rename game_template/typeclasses/{exit.py => exits.py} (100%) rename game_template/typeclasses/{object.py => objects.py} (100%) rename game_template/typeclasses/{player.py => players.py} (80%) rename game_template/typeclasses/{room.py => rooms.py} (100%) rename game_template/typeclasses/{script.py => scripts.py} (100%) diff --git a/bin/evennia.py b/bin/evennia.py index c29f68a0b7..d902f0d7ff 100755 --- a/bin/evennia.py +++ b/bin/evennia.py @@ -448,13 +448,15 @@ def init_game_directory(path): # testing the main library import. If there are errors in importing # the main library, it should show here. - importlib.import_module("evennia") + evennia = importlib.import_module("evennia") + evennia.init() # check all dependencies from evennia.utils.utils import check_evennia_dependencies if not check_evennia_dependencies: sys.exit() + # set up the Evennia executables and log file locations global SERVER_PY_FILE, PORTAL_PY_FILE global SERVER_LOGFILE, PORTAL_LOGFILE, HTTP_LOGFILE @@ -766,13 +768,13 @@ def error_check_python_modules(): mod, fromlist = path, "None" if split: mod, fromlist = path.rsplit('.', 1) - __import__(mod, fromlist=[fromlist]) + __import__(mod, fromlist=[fromlist]) # core modules imp(settings.COMMAND_PARSER) imp(settings.SEARCH_AT_RESULT) imp(settings.SEARCH_AT_MULTIMATCH_INPUT) - imp(settings.CONNECTION_SCREEN_MODULE, split=False) + imp(settings.CONNECTION_SCREEN_MODULE) #imp(settings.AT_INITIAL_SETUP_HOOK_MODULE, split=False) for path in settings.LOCK_FUNC_MODULES: imp(path, split=False) diff --git a/evennia/__init__.py b/evennia/__init__.py index 658883eabf..d12b57f5dd 100644 --- a/evennia/__init__.py +++ b/evennia/__init__.py @@ -12,54 +12,117 @@ See www.evennia.com for full documentation. """ -if False: +# Delayed loading of properties - ###################################################################### - # set Evennia version in __version__ property - ###################################################################### - import os - try: - __version__ = "Evennia" - with os.path.join(open(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "VERSION.txt", 'r') as f: - __version__ += " %s" % f.read().strip() - except IOError: - __version__ += " (unknown version)" - del os +# Typeclasses +DefaultPlayer = None +DefaultGuest = None +DefaultObject = None +DefaultCharacter = None +DefaultRoom = None +DefaultExit = None +Channel = None +Script = None - ###################################################################### - # Start Evennia API - # (easiest is to import this module interactively to explore it) - ###################################################################### +# Database models +ObjectDB = None +PlayerDB = None +ScriptDB = None +ChannelDB = None +Msg = None - # help entries - from help.models import HelpEntry +# commands +Command = None +default_cmds = None +syscmdkeys = None - # players - from players.player import DefaultPlayer +# search functions +search_object = None +search_script = None +search_player = None +search_channel = None +search_help = None + +# create functions +create_object = None +create_script = None +create_player = None +create_channel = None +create_message = None + +# utilities +lockfuncs = None +tickerhandler = None +logger = None +utils = None +gametime = None +ansi = None +spawn = None +managers = None + +import os +try: + __version__ = "Evennia" + with os.path.join(open(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "VERSION.txt", 'r') as f: + __version__ += " %s" % f.read().strip() +except IOError: + __version__ += " (unknown version)" +del os + + +def init(): + """ + This is called only after Evennia has fully initialized all its models. + """ + def imp(path, variable=True): + "Helper function" + mod, fromlist = path, "None" + if variable: + mod, fromlist = path.rsplit('.', 1) + return __import__(mod, fromlist=[fromlist]) + + global DefaultPlayer, DefaultObject, DefaultGuest, DefaultCharacter, DefaultRoom, DefaultExit, Channel, Script + global ObjectDB, PlayerDB, ScriptDB, ChannelDB, Msg + global Command, default_cmds, syscmdkeys + global search_object, search_script, search_player, search_channel, search_help + global create_object, create_script, create_player, create_channel, create_message + global lockfuncs, tickerhandler, logger, utils, gametime, ansi, spawn, managers + + from players.players import DefaultPlayer + from players.players import DefaultGuest + from objects.objects import DefaultObject + from objects.objects import DefaultCharacter + from objects.objects import DefaultRoom + from objects.objects import DefaultExit + from comms.comms import Channel + from scripts.scripts import Script + + # Database models + from objects.models import ObjectDB from players.models import PlayerDB + from scripts.models import ScriptDB + from comms.models import ChannelDB + from comms.models import Msg # commands from commands.command import Command - from commands.cmdset import CmdSet - # (default_cmds is created below) - # locks + # search functions + from utils.search import search_object + from utils.search import search_script + from utils.search import search_player + from utils.search import search_channel + from utils.search import search_help + + # create functions + from utils.create import create_object + from utils.create import create_script + from utils.create import create_player + from utils.create import create_channel + from utils.create import create_message + + # utilities from locks import lockfuncs - - # scripts - from scripts.scripts import Script - - # comms - from comms.models import Msg, ChannelDB - from comms.comms import Channel - - # objects - from objects.objects import DefaultObject, DefaultCharacter, DefaultRoom, DefaultExit - - # utils - - from utils.search import * - from utils.create import * from scripts.tickerhandler import TICKER_HANDLER as tickerhandler from utils import logger from utils import utils @@ -67,25 +130,7 @@ if False: from utils import ansi from utils.spawner import spawn - ###################################################################### - # API containers and helper functions - ###################################################################### - - def help(header=False): - """ - Main Evennia API. - ev.help() views API contents - ev.help(True) or ev.README shows module instructions - - See www.evennia.com for the full documentation. - """ - if header: - return __doc__ - else: - import ev - names = [str(var) for var in ev.__dict__ if not var.startswith('_')] - return ", ".join(names) - + # API containers class _EvContainer(object): """ diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index 1b739a415c..b2fef6a131 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -1814,7 +1814,7 @@ class CmdExamine(ObjManipCommand): obj_name = objdef['name'] obj_attrs = objdef['attrs'] - self.player_mode = utils.inherits_from(caller, "evennia.players.player.Player") or \ + self.player_mode = utils.inherits_from(caller, "evennia.players.players.Player") or \ "player" in self.switches or obj_name.startswith('*') if self.player_mode: try: diff --git a/evennia/commands/default/player.py b/evennia/commands/default/player.py index 4164b73c48..ac33a00048 100644 --- a/evennia/commands/default/player.py +++ b/evennia/commands/default/player.py @@ -26,6 +26,7 @@ from evennia.commands.default.muxcommand import MuxPlayerCommand from evennia.utils import utils, create, search, prettytable from settings import MAX_NR_CHARACTERS, MULTISESSION_MODE + # limit symbol import for API __all__ = ("CmdOOCLook", "CmdIC", "CmdOOC", "CmdPassword", "CmdQuit", "CmdCharCreate", "CmdEncoding", "CmdSessions", "CmdWho", diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index c7e5bce086..4de01727ec 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -17,7 +17,7 @@ from django.conf import settings from django.utils.unittest import TestCase from evennia.server.serversession import ServerSession from evennia.objects.objects import DefaultObject, DefaultCharacter -from evennia.players.player import DefaultPlayer +from evennia.players.players import DefaultPlayer from evennia.utils import create, ansi from evennia.server.sessionhandler import SESSIONS diff --git a/evennia/players/bots.py b/evennia/players/bots.py index e9d652575e..936b4f19ec 100644 --- a/evennia/players/bots.py +++ b/evennia/players/bots.py @@ -5,7 +5,7 @@ Player that are controlled by the server. """ from django.conf import settings -from evennia.players.player import DefaultPlayer +from evennia.players.players import DefaultPlayer from evennia.scripts.scripts import Script from evennia.commands.command import Command from evennia.commands.cmdset import CmdSet diff --git a/evennia/players/player.py b/evennia/players/players.py similarity index 99% rename from evennia/players/player.py rename to evennia/players/players.py index 513e98dedf..84b3c89af4 100644 --- a/evennia/players/player.py +++ b/evennia/players/players.py @@ -663,7 +663,7 @@ class DefaultPlayer(PlayerDB): pass -class Guest(DefaultPlayer): +class DefaultGuest(DefaultPlayer): """ This class is used for guest logins. Unlike Players, Guests and their characters are deleted after disconnection. @@ -681,7 +681,7 @@ class Guest(DefaultPlayer): A Guest's characters aren't meant to linger on the server. When a Guest disconnects, we remove its character. """ - super(Guest, self).at_disconnect() + super(DefaultGuest, self).at_disconnect() characters = self.db._playable_characters for character in filter(None, characters): character.delete() @@ -690,7 +690,7 @@ class Guest(DefaultPlayer): """ We repeat at_disconnect() here just to be on the safe side. """ - super(Guest, self).at_server_shutdown() + super(DefaultGuest, self).at_server_shutdown() characters = self.db._playable_characters for character in filter(None, characters): character.delete() @@ -700,5 +700,5 @@ class Guest(DefaultPlayer): Guests aren't meant to linger on the server, either. We need to wait until after the Guest disconnects to delete it, though. """ - super(Guest, self).at_post_disconnect() + super(DefaultGuest, self).at_post_disconnect() self.delete() diff --git a/evennia/settings_default.py b/evennia/settings_default.py index 926370465b..08442e1176 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -280,17 +280,17 @@ PLAYER_TYPECLASS_PATHS = ["typeclasses", "contrib"] CHANNEL_TYPECLASS_PATHS = ["typeclasses", "contrib"] # Typeclass for player objects (linked to a character) (fallback) -BASE_PLAYER_TYPECLASS = "typeclasses.player.Player" +BASE_PLAYER_TYPECLASS = "typeclasses.players.Player" # Typeclass and base for all objects (fallback) -BASE_OBJECT_TYPECLASS = "typeclasses.object.Object" +BASE_OBJECT_TYPECLASS = "typeclasses.objects.Object" # Typeclass for character objects linked to a player (fallback) -BASE_CHARACTER_TYPECLASS = "typeclasses.character.Character" +BASE_CHARACTER_TYPECLASS = "typeclasses.characters.Character" # Typeclass for rooms (fallback) -BASE_ROOM_TYPECLASS = "typeclasses.room.Room" +BASE_ROOM_TYPECLASS = "typeclasses.rooms.Room" # Typeclass for Exit objects (fallback). -BASE_EXIT_TYPECLASS = "typeclasses.exit.Exit" +BASE_EXIT_TYPECLASS = "typeclasses.exits.Exit" # Typeclass for Channel (fallback). -BASE_CHANNEL_TYPECLASS = "typeclasses.channel.Channel" +BASE_CHANNEL_TYPECLASS = "typeclasses.channels.Channel" # Typeclass for Scripts (fallback). You usually don't need to change this # but create custom variations of scripts on a per-case basis instead. BASE_SCRIPT_TYPECLASS = "typeclasses.scripts.Script" @@ -399,7 +399,7 @@ CLIENT_DEFAULT_HEIGHT = 45 # telnet standard is 24 but does anyone use such # This enables guest logins, by default via "connect guest" GUEST_ENABLED = False # Typeclass for guest player objects (linked to a character) -BASE_GUEST_TYPECLASS = "typeclasses.player.Guest" +BASE_GUEST_TYPECLASS = "typeclasses.players.Guest" # The permission given to guests PERMISSION_GUEST_DEFAULT = "Guests" # The default home location used for guests. diff --git a/evennia/utils/search.py b/evennia/utils/search.py index 6214624ba2..3cb71b7541 100644 --- a/evennia/utils/search.py +++ b/evennia/utils/search.py @@ -174,10 +174,11 @@ channels = search_channels # category - limit the search to a particular help topic # """ -search_help_entry = HelpEntry.objects.search_help -search_help_entries = search_help_entry -help_entry_search = search_help_entry -help_entries = search_help_entries +search_help = HelpEntry.objects.search_help +search_help_entry = search_help +search_help_entries = search_help +help_entry_search = search_help +help_entries = search_help # Locate Attributes diff --git a/game_template/typeclasses/character.py b/game_template/typeclasses/characters.py similarity index 100% rename from game_template/typeclasses/character.py rename to game_template/typeclasses/characters.py diff --git a/game_template/typeclasses/exit.py b/game_template/typeclasses/exits.py similarity index 100% rename from game_template/typeclasses/exit.py rename to game_template/typeclasses/exits.py diff --git a/game_template/typeclasses/object.py b/game_template/typeclasses/objects.py similarity index 100% rename from game_template/typeclasses/object.py rename to game_template/typeclasses/objects.py diff --git a/game_template/typeclasses/player.py b/game_template/typeclasses/players.py similarity index 80% rename from game_template/typeclasses/player.py rename to game_template/typeclasses/players.py index c4203992dc..5c1d3beb17 100644 --- a/game_template/typeclasses/player.py +++ b/game_template/typeclasses/players.py @@ -6,10 +6,23 @@ Player object. A Player is what chats on default channels but has no other in-game-world existance. Rather the Player puppets Objects (such as Characters) in order to actually participate in the game world. + +Guest + +Guest players are simple low-level accounts that are created/deleted +on the fly and allows users to test the game without the committment +of a full registration. Guest accounts are deactivated by default; to +activate them, add the following line to your settings file: + + GUEST_ENABLED = True + +You will also need to modify the connection screen to reflect the +possibility to connect with a guest account. The setting file accepts +several more options for customizing the Guest account system. + """ -from evennia import DefaultPlayer - +from evennia import DefaultPlayer, DefaultGuest class Player(DefaultPlayer): """ @@ -79,3 +92,11 @@ class Player(DefaultPlayer): """ pass + + +class Guest(DefaultGuest): + """ + This class is used for guest logins. Unlike Players, Guests and their + characters are deleted after disconnection. + """ + pass diff --git a/game_template/typeclasses/room.py b/game_template/typeclasses/rooms.py similarity index 100% rename from game_template/typeclasses/room.py rename to game_template/typeclasses/rooms.py diff --git a/game_template/typeclasses/script.py b/game_template/typeclasses/scripts.py similarity index 100% rename from game_template/typeclasses/script.py rename to game_template/typeclasses/scripts.py