Finally caved in and created a command table. It's just going to get too messy with @-commands doing straight module lookups, plus the dict is probably a little faster. Feel free to start moving non-privved @-commands to commands_general and vice-versa since we now have the ability to do so.

This commit is contained in:
Greg Taylor 2007-05-11 15:23:27 +00:00
parent 2fc06adcfa
commit ac32ab05c1
7 changed files with 174 additions and 43 deletions

View file

@ -638,6 +638,47 @@ class CommChannel(models.Model):
class Admin: class Admin:
list_display = ('name', 'owner') list_display = ('name', 'owner')
def get_name(self):
"""
Returns a channel's name.
"""
return self.name
def get_header(self):
"""
Returns the channel's header text, or what is shown before each channel
message.
"""
return ansi.parse_ansi(self.header)
def get_owner(self):
"""
Returns a channels' owner.
"""
return self.owner
def set_name(self, new_name):
"""
Rename a channel
"""
self.name = ansi.parse_ansi(new_name, strip_ansi=True)
self.header = "[%s]" % (ansi.parse_ansi(new_name),)
self.save()
def set_header(self, new_header):
"""
Sets a channel's header text.
"""
self.header = ansi.parse_ansi(new_header)
self.save()
def set_owner(self, new_owner):
"""
Sets a channel's owner.
"""
self.owner = new_owner
self.save()
class CommChannelMessage(models.Model): class CommChannelMessage(models.Model):
""" """
A single logged channel message. A single logged channel message.

View file

@ -2,7 +2,9 @@ from traceback import format_exc
import time import time
import commands_privileged import commands_privileged
import commands_general import commands_general
import commands_comsys
import commands_unloggedin import commands_unloggedin
import cmdtable
import functions_db import functions_db
import functions_general import functions_general
@ -71,30 +73,28 @@ def handle(cdat):
# Player-visible idle time, not used in idle timeout calcs. # Player-visible idle time, not used in idle timeout calcs.
session.cmd_last_visible = time.time() session.cmd_last_visible = time.time()
# If it's prefixed by an '@', it's a staff command. # Shortened say alias.
if parsed_input['root_cmd'][0] != '@': if parsed_input['root_cmd'][0] == '"':
# Shortened say alias. parsed_input['splitted'].insert(0, "say")
if parsed_input['root_cmd'][0] == '"': parsed_input['splitted'][1] = parsed_input['splitted'][1][1:]
parsed_input['splitted'].insert(0, "say") parsed_input['root_cmd'] = 'say'
parsed_input['splitted'][1] = parsed_input['splitted'][1][1:] # Shortened pose alias.
parsed_input['root_cmd'] = 'say' elif parsed_input['root_cmd'][0] == ':':
# Shortened pose alias. parsed_input['splitted'].insert(0, "pose")
elif parsed_input['root_cmd'][0] == ':': parsed_input['splitted'][1] = parsed_input['splitted'][1][1:]
parsed_input['splitted'].insert(0, "pose") parsed_input['root_cmd'] = 'pose'
parsed_input['splitted'][1] = parsed_input['splitted'][1][1:] # Pose without space alias.
parsed_input['root_cmd'] = 'pose' elif parsed_input['root_cmd'][0] == ';':
# Pose without space alias. parsed_input['splitted'].insert(0, "pose/nospace")
elif parsed_input['root_cmd'][0] == ';': parsed_input['root_chunk'] = ['pose', 'nospace']
parsed_input['splitted'].insert(0, "pose/nospace") parsed_input['splitted'][1] = parsed_input['splitted'][1][1:]
parsed_input['root_chunk'] = ['pose', 'nospace'] parsed_input['root_cmd'] = 'pose'
parsed_input['splitted'][1] = parsed_input['splitted'][1][1:]
parsed_input['root_cmd'] = 'pose' # Get the command's function reference (Or False)
cmd = getattr(commands_general, 'cmd_%s' % (parsed_input['root_cmd'],), None ) cmd = cmdtable.return_cfunc(parsed_input['root_cmd'])
else:
parsed_input['root_cmd'] = parsed_input['root_cmd'][1:]
cmd = getattr(commands_privileged, 'cmd_%s' % (parsed_input['root_cmd'],), None )
else: else:
cmd = getattr(commands_unloggedin, 'cmd_%s' % (parsed_input['root_cmd'],), None ) # Not logged in, look through the unlogged-in command table.
cmd = cmdtable.return_cfunc(parsed_input['root_cmd'], unlogged_cmd=True)
# Debugging stuff. # Debugging stuff.
#session.msg("ROOT : %s" % (parsed_input['root_cmd'],)) #session.msg("ROOT : %s" % (parsed_input['root_cmd'],))

61
cmdtable.py Normal file
View file

@ -0,0 +1,61 @@
import commands_unloggedin
import commands_general
import commands_privileged
import commands_comsys
# Unlogged-in Command Table
uncon_ctable = {
"connect": commands_unloggedin.cmd_connect,
"create": commands_unloggedin.cmd_create,
"quit": commands_unloggedin.cmd_quit,
}
# Command Table
ctable = {
"drop": commands_general.cmd_drop,
"examine": commands_general.cmd_examine,
"get": commands_general.cmd_get,
"help": commands_general.cmd_help,
"idle": commands_general.cmd_idle,
"inventory": commands_general.cmd_inventory,
"look": commands_general.cmd_look,
"page": commands_general.cmd_page,
"pose": commands_general.cmd_pose,
"quit": commands_general.cmd_quit,
"say": commands_general.cmd_say,
"time": commands_general.cmd_time,
"uptime": commands_general.cmd_uptime,
"version": commands_general.cmd_version,
"who": commands_general.cmd_who,
"@ccreate": commands_privileged.cmd_ccreate,
"@create": commands_privileged.cmd_create,
"@description": commands_privileged.cmd_description,
"@destroy": commands_privileged.cmd_destroy,
"@dig": commands_privileged.cmd_dig,
"@emit": commands_privileged.cmd_emit,
"@find": commands_privileged.cmd_find,
"@link": commands_privileged.cmd_link,
"@list": commands_privileged.cmd_list,
"@name": commands_privileged.cmd_name,
"@nextfree": commands_privileged.cmd_nextfree,
"@newpassword": commands_privileged.cmd_newpassword,
"@open": commands_privileged.cmd_open,
"@password": commands_privileged.cmd_password,
"@reload": commands_privileged.cmd_reload,
"@set": commands_privileged.cmd_set,
"@shutdown": commands_privileged.cmd_shutdown,
"@teleport": commands_privileged.cmd_teleport,
"@unlink": commands_privileged.cmd_unlink,
"@wall": commands_privileged.cmd_wall,
}
def return_cfunc(func_name, unlogged_cmd=False):
"""
Returns a reerence to the command's function. If there are no matches,
returns false.
"""
if not unlogged_cmd:
return ctable.get(func_name, False)
else:
return uncon_ctable.get(func_name, False)

View file

@ -11,6 +11,7 @@ import os
Comsys command module. Pretty much every comsys command should go here for Comsys command module. Pretty much every comsys command should go here for
now. now.
""" """
def cmd_addcom(cdat): def cmd_addcom(cdat):
""" """
addcom addcom
@ -54,14 +55,6 @@ def cmd_clist(cdat):
""" """
pass pass
def cmd_ccreate(cdat):
"""
@ccreate
Creates a channel.
"""
pass
def cmd_cdestroy(cdat): def cmd_cdestroy(cdat):
""" """
@cdestroy @cdestroy

View file

@ -3,6 +3,7 @@ import resource
import functions_db import functions_db
import functions_general import functions_general
import functions_comsys
import commands_general import commands_general
import commands_unloggedin import commands_unloggedin
import cmdhandler import cmdhandler
@ -271,6 +272,24 @@ def cmd_emit(cdat):
else: else:
pobject.get_location().emit_to_contents(message) pobject.get_location().emit_to_contents(message)
def cmd_ccreate(cdat):
"""
Creates a new channel.
"""
session = cdat['session']
pobject = session.get_pobject()
uinput= cdat['uinput']['splitted']
cname = ' '.join(uinput[1:])
if cname == '':
session.msg("You must supply a name!")
else:
# Create and set the object up.
cdat = {"name": cname, "owner": pobject}
new_chan = functions_comsys.create_channel(cdat)
session.msg("Channel %s created." % (new_chan.get_name(),))
def cmd_create(cdat): def cmd_create(cdat):
""" """
Creates a new object of type 'THING'. Creates a new object of type 'THING'.

View file

@ -1,8 +1,10 @@
from apps.objects.models import CommChannel
import session_mgr import session_mgr
import commands_privileged import commands_privileged
import commands_general import commands_general
import commands_comsys import commands_comsys
import commands_unloggedin import commands_unloggedin
import ansi
""" """
Comsys functions. Comsys functions.
""" """
@ -21,3 +23,17 @@ def get_com_who(channel, muted=False, disconnected=False):
def get_user_channels(player): def get_user_channels(player):
pass pass
def create_channel(cdat):
"""
Create a new channel. cdat is a dictionary that contains the following keys.
REQUIRED KEYS:
* name: The name of the new channel.
* owner: The creator of the channel.
"""
new_chan = CommChannel()
new_chan.name = ansi.parse_ansi(cdat["name"], strip_ansi=True)
new_chan.header = "[%s]" % (ansi.parse_ansi(cdat["name"]),)
new_chan.set_owner(cdat["owner"])
new_chan.save()
return new_chan

View file

@ -102,7 +102,8 @@ class Server(dispatcher):
'commands_privileged', 'commands_unloggedin', 'defines_global', 'commands_privileged', 'commands_unloggedin', 'defines_global',
'events', 'functions_db', 'functions_general', 'functions_help', 'events', 'functions_db', 'functions_general', 'functions_help',
'gameconf', 'session', 'apps.objects.models', 'gameconf', 'session', 'apps.objects.models',
'apps.helpsys.models', 'apps.config.models'] 'apps.helpsys.models', 'apps.config.models', 'functions_comsys',
'commands_comsys']
for mod in reload_list: for mod in reload_list:
reload(sys.modules[mod]) reload(sys.modules[mod])