You can now @destroy objects and players. Fine-tuning of misc. stuff also.

This commit is contained in:
Greg Taylor 2006-12-22 00:51:26 +00:00
parent 81d9eb313a
commit 6bb2be6068
7 changed files with 171 additions and 39 deletions

View file

@ -60,6 +60,41 @@ class Object(models.Model):
""" """
BEGIN COMMON METHODS BEGIN COMMON METHODS
""" """
def emit_to(self, message):
"""
Emits something to any sessions attached to the object.
message: (str) The message to send
"""
def is_staff(self):
"""
Returns TRUE if the object is a staff player.
"""
if not self.is_player():
return False
profile = User.objects.filter(id=self.id)
if len(profile) == 0:
return False
else:
return profile[0].is_staff
def is_superuser(self):
"""
Returns TRUE if the object is a super user player.
"""
if not self.is_player():
return False
profile = User.objects.filter(id=self.id)
if len(profile) == 0:
return False
else:
return profile[0].is_superuser
def set_name(self, new_name): def set_name(self, new_name):
""" """
Rename an object. Rename an object.
@ -113,12 +148,44 @@ class Object(models.Model):
attribs = Attribute.objects.filter(object=self) attribs = Attribute.objects.filter(object=self)
return attribs return attribs
def delete(self, server): def destroy(self, session_list):
""" """
Deletes an object. Destroys an object, sets it to GOING. Can still be recovered
if the user decides to.
server: (Server) Reference to the server object. session_list: (list) The server's session_list attribute.
""" """
# See if we need to kick the player off.
session = functions_db.session_from_object(session_list, self)
if session:
session.msg("You have been destroyed, goodbye.")
session.handle_close()
# If the object is a player, set the player account object to inactive.
# It can still be recovered at this point.
if self.is_player():
print 'PLAYER'
uobj = User.objects.get(id=self.id)
print 'VICTIM', uobj
uobj.is_active = False
uobj.save()
# Set the object type to GOING
self.type = 5
self.save()
def delete(self, session_list):
"""
Deletes an object permanently. Marks it for re-use by a new object.
session_list: (list) The server's session_list attribute.
"""
# Delete the associated player object permanently.
uobj = User.objects.filter(id=self.id)
if len(uobj) > 0:
uobj[0].delete()
# Set the object to type GARBAGE. # Set the object to type GARBAGE.
self.type = 6 self.type = 6
self.save() self.save()
@ -177,8 +244,8 @@ class Object(models.Model):
if value == False and has_flag: if value == False and has_flag:
# Clear the flag. # Clear the flag.
if functions_db.not_saved_flag(flag): if functions_db.is_unsavable_flag(flag):
# Not a savable flag. # Not a savable flag (CONNECTED, etc)
flags = self.nosave_flags.split() flags = self.nosave_flags.split()
flags.remove(flag) flags.remove(flag)
self.nosave_flags = ' '.join(flags) self.nosave_flags = ' '.join(flags)
@ -197,8 +264,8 @@ class Object(models.Model):
pass pass
else: else:
# Setting a flag. # Setting a flag.
if functions_db.not_saved_flag(flag): if functions_db.is_unsavable_flag(flag):
# Not a savable flag. # Not a savable flag (CONNECTED, etc)
flags = self.nosave_flags.split() flags = self.nosave_flags.split()
flags.append(flag) flags.append(flag)
self.nosave_flags = ' '.join(flags) self.nosave_flags = ' '.join(flags)
@ -231,7 +298,7 @@ class Object(models.Model):
""" """
return self.location return self.location
def get_attribute_value(self, attrib): def get_attribute_value(self, attrib, default=False):
""" """
Returns the value of an attribute on an object. Returns the value of an attribute on an object.
@ -241,6 +308,9 @@ class Object(models.Model):
attrib = Attribute.objects.filter(object=self).filter(name=attrib) attrib = Attribute.objects.filter(object=self).filter(name=attrib)
attrib_value = attrib[0].value attrib_value = attrib[0].value
return attrib_value.value return attrib_value.value
else:
if default:
return default
else: else:
return False return False

View file

@ -2,12 +2,31 @@ import settings
import time import time
import functions_general import functions_general
import functions_db import functions_db
import global_defines
from ansi import * from ansi import *
""" """
Generic command module. Pretty much every command should go here for Generic command module. Pretty much every command should go here for
now. now.
""" """
def cmd_inventory(cdat):
"""
Shows a player's inventory.
"""
session = cdat['session']
pobject = session.get_pobject()
session.msg("You are carrying:")
for item in pobject.get_contents():
session.msg(" %s" % (item,))
money = pobject.get_attribute_value("MONEY", default=0)
if money > 0:
money_name = functions_db.get_server_config("MONEY_NAME_PLURAL")
else:
money_name = functions_db.get_server_config("MONEY_NAME_SINGULAR")
session.msg("You have %d %s." % (money,money_name))
def cmd_look(cdat): def cmd_look(cdat):
""" """
@ -49,10 +68,10 @@ def cmd_look(cdat):
con_exits = [] con_exits = []
for obj in target_obj.get_contents(): for obj in target_obj.get_contents():
if obj.is_player: if obj.is_player():
if obj != pobject: if obj != pobject:
con_players.append(obj) con_players.append(obj)
elif obj.is_exit: elif obj.is_exit():
con_exits.append(obj) con_exits.append(obj)
else: else:
con_things.append(obj) con_things.append(obj)
@ -62,7 +81,7 @@ def cmd_look(cdat):
for player in con_players: for player in con_players:
session.msg('%s' %(player,)) session.msg('%s' %(player,))
if con_things: if con_things:
session.msg("%sThings:%s" % (ansi["hilite"], ansi["normal"],)) session.msg("%sContents:%s" % (ansi["hilite"], ansi["normal"],))
for thing in con_things: for thing in con_things:
session.msg('%s' %(thing,)) session.msg('%s' %(thing,))
if con_exits: if con_exits:

View file

@ -18,6 +18,11 @@ def cmd_destroy(cdat):
session = cdat['session'] session = cdat['session']
pobject = session.get_pobject() pobject = session.get_pobject()
args = cdat['uinput']['splitted'][1:] args = cdat['uinput']['splitted'][1:]
switches = cdat['uinput']['root_chunk'][1:]
switch_override = False
if "override" in switches:
switch_override = True
if len(args) == 0: if len(args) == 0:
session.msg("Destroy what?") session.msg("Destroy what?")
@ -34,13 +39,27 @@ def cmd_destroy(cdat):
session.msg("I don't see that here.") session.msg("I don't see that here.")
return return
elif results[0].is_player(): elif results[0].is_player():
session.msg("You must @nuke players, not @destroy them.") if pobject.id == results[0].id:
session.msg("You can't destroy yourself.")
return
if not switch_override:
session.msg("You must use @destroy/override on players.")
return
if results[0].is_superuser():
session.msg("You can't destroy a superuser.")
return
target_obj = results[0]
elif results[0].is_going():
session.msg("That object is already destroyed.")
return
elif results[0].is_garbage():
session.msg("That object is already destroyed.")
return return
else: else:
target_obj = results[0] target_obj = results[0]
session.msg("You destroy %s." % (target_obj,)) session.msg("You destroy %s." % (target_obj,))
target_obj.delete(session.server) target_obj.destroy(session.server.session_list)
def cmd_name(cdat): def cmd_name(cdat):
""" """
@ -90,7 +109,7 @@ def cmd_dig(cdat):
else: else:
# Create and set the object up. # Create and set the object up.
odat = {"name": roomname, "type": 2, "location": None, "owner": pobject} odat = {"name": roomname, "type": 2, "location": None, "owner": pobject}
new_object = functions_db.create_object(server, odat) new_object = functions_db.create_object(odat)
session.msg("You create a new room: %s" % (new_object,)) session.msg("You create a new room: %s" % (new_object,))
@ -109,7 +128,7 @@ def cmd_create(cdat):
else: else:
# Create and set the object up. # Create and set the object up.
odat = {"name": thingname, "type": 3, "location": pobject, "owner": pobject} odat = {"name": thingname, "type": 3, "location": pobject, "owner": pobject}
new_object = functions_db.create_object(server, odat) new_object = functions_db.create_object(odat)
session.msg("You create a new thing: %s" % (new_object,)) session.msg("You create a new thing: %s" % (new_object,))
@ -118,10 +137,12 @@ def cmd_nextfree(cdat):
Returns the next free object number. Returns the next free object number.
""" """
session = cdat['session'] session = cdat['session']
server = cdat['server']
nextfree = functions_db.get_nextfree_dbnum() nextfree = functions_db.get_nextfree_dbnum()
if str(nextfree).isdigit():
retval = "Next free object number: #%s" % (nextfree,) retval = "Next free object number: #%s" % (nextfree,)
else:
retval = "Next free object number: #%s (GARBAGE)" % (nextfree.id,)
session.msg(retval) session.msg(retval)
@ -174,7 +195,7 @@ def cmd_open(cdat):
else: else:
# Create an un-linked exit. # Create an un-linked exit.
odat = {"name": thingname, "type": 3, "location": pobject, "owner": pobject} odat = {"name": thingname, "type": 3, "location": pobject, "owner": pobject}
new_object = functions_db.create_object(server, odat) new_object = functions_db.create_object(odat)
session.msg("You create a new thing: %s" % (new_object,)) session.msg("You create a new thing: %s" % (new_object,))
@ -291,7 +312,7 @@ def cmd_set(cdat):
attrib_value = eq_args[1][splicenum:] attrib_value = eq_args[1][splicenum:]
# In global_defines.py, see NOSET_ATTRIBS for protected attribute names. # In global_defines.py, see NOSET_ATTRIBS for protected attribute names.
if not functions_db.modifiable_attrib(attrib_name): if not functions_db.is_modifiable_attrib(attrib_name):
session.msg("You can't modify that attribute.") session.msg("You can't modify that attribute.")
return return
@ -313,14 +334,14 @@ def cmd_set(cdat):
if flag[0] == '!': if flag[0] == '!':
# We're un-setting the flag. # We're un-setting the flag.
flag = flag[1:] flag = flag[1:]
if not functions_db.modifiable_flag(flag): if not functions_db.is_modifiable_flag(flag):
session.msg("You can't set/unset the flag - %s." % (flag,)) session.msg("You can't set/unset the flag - %s." % (flag,))
else: else:
session.msg('%s - %s cleared.' % (victim.get_name(), flag.upper(),)) session.msg('%s - %s cleared.' % (victim.get_name(), flag.upper(),))
victim.set_flag(flag, False) victim.set_flag(flag, False)
else: else:
# We're setting the flag. # We're setting the flag.
if not functions_db.modifiable_flag(flag): if not functions_db.is_modifiable_flag(flag):
session.msg("You can't set/unset the flag - %s." % (flag,)) session.msg("You can't set/unset the flag - %s." % (flag,))
else: else:
session.msg('%s - %s set.' % (victim.get_name(), flag.upper(),)) session.msg('%s - %s set.' % (victim.get_name(), flag.upper(),))

View file

@ -2,15 +2,22 @@ import sets
from django.db import connection from django.db import connection
from django.contrib.auth.models import User from django.contrib.auth.models import User
from apps.objects.models import Object from apps.objects.models import Object
from apps.config.models import ConfigValue
import global_defines import global_defines
def not_saved_flag(flagname): def get_server_config(configname):
""" """
Returns TRUE if the flag is not a savable flag. Returns a server config value.
"""
return ConfigValue.objects.get(conf_key=configname).conf_value
def is_unsavable_flag(flagname):
"""
Returns TRUE if the flag is an unsavable flag.
""" """
return flagname in global_defines.NOSAVE_FLAGS return flagname in global_defines.NOSAVE_FLAGS
def modifiable_flag(flagname): def is_modifiable_flag(flagname):
""" """
Check to see if a particular flag is modifiable. Check to see if a particular flag is modifiable.
""" """
@ -19,7 +26,7 @@ def modifiable_flag(flagname):
else: else:
return False return False
def modifiable_attrib(attribname): def is_modifiable_attrib(attribname):
""" """
Check to see if a particular attribute is modifiable. Check to see if a particular attribute is modifiable.
""" """
@ -31,18 +38,22 @@ def modifiable_attrib(attribname):
def get_nextfree_dbnum(): def get_nextfree_dbnum():
""" """
Figure out what our next free database reference number is. Figure out what our next free database reference number is.
If we need to recycle a GARBAGE object, return the object to recycle
Otherwise, return the first free dbref.
""" """
# First we'll see if there's an object of type 6 (GARBAGE) that we # First we'll see if there's an object of type 6 (GARBAGE) that we
# can recycle. # can recycle.
nextfree = Object.objects.filter(type__exact=6) nextfree = Object.objects.filter(type__exact=6)
if nextfree: if nextfree:
# We've got at least one garbage object to recycle. # We've got at least one garbage object to recycle.
#return nextfree.id print 'GARB'
return nextfree[0].id return nextfree[0]
else: else:
# No garbage to recycle, find the highest dbnum and increment it # No garbage to recycle, find the highest dbnum and increment it
# for our next free. # for our next free.
return Object.objects.order_by('-id')[0].id + 1 print 'NOTGARB'
return int(Object.objects.order_by('-id')[0].id + 1)
def list_search_object_namestr(searchlist, ostring, dbref_only=False): def list_search_object_namestr(searchlist, ostring, dbref_only=False):
""" """
@ -96,8 +107,11 @@ def is_dbref(dbstring):
def session_from_object(session_list, targobject): def session_from_object(session_list, targobject):
""" """
Return the session object given a object (if there is one open). Return the session object given a object (if there is one open).
session_list: (list) The server's session_list attribute.
targobject: (Object) The object to match.
""" """
results = [prospect for prospect in session_list if prospect.get_pobject() == targobject] results = [prospect for prospect in session_list if prospect.get_pobject().id == targobject.id]
if results: if results:
return results[0] return results[0]
else: else:
@ -106,6 +120,8 @@ def session_from_object(session_list, targobject):
def session_from_dbref(session_list, dbstring): def session_from_dbref(session_list, dbstring):
""" """
Return the session object given a dbref (if there is one open). Return the session object given a dbref (if there is one open).
dbstring: (int) The dbref number to match against.
""" """
if is_dbref(dbstring): if is_dbref(dbstring):
results = [prospect for prospect in session_list if prospect.get_pobject().dbref_match(dbstring)] results = [prospect for prospect in session_list if prospect.get_pobject().dbref_match(dbstring)]
@ -120,7 +136,7 @@ def get_object_from_dbref(dbref):
""" """
return Object.objects.get(id=dbref) return Object.objects.get(id=dbref)
def create_object(server, odat): def create_object(odat):
""" """
Create a new object. odat is a dictionary that contains the following keys. Create a new object. odat is a dictionary that contains the following keys.
REQUIRED KEYS: REQUIRED KEYS:
@ -132,7 +148,13 @@ def create_object(server, odat):
* home: Reference to another object to home to. If not specified, use * home: Reference to another object to home to. If not specified, use
location key for home. location key for home.
""" """
next_dbref = get_nextfree_dbnum()
if not str(next_dbref).isdigit():
# Recycle a garbage object.
new_object = next_dbref
else:
new_object = Object() new_object = Object()
new_object.name = odat["name"] new_object.name = odat["name"]
new_object.type = odat["type"] new_object.type = odat["type"]
@ -154,8 +176,6 @@ def create_object(server, odat):
new_object.home = odat["location"] new_object.home = odat["location"]
new_object.save() new_object.save()
# Add the object to our server's dictionary of objects.
new_object.move_to(odat['location']) new_object.move_to(odat['location'])
return new_object return new_object
@ -189,7 +209,7 @@ def create_user(cdat, uname, email, password):
# Create a player object of the same ID in the Objects table. # Create a player object of the same ID in the Objects table.
odat = {"id": uid, "name": uname, "type": 1, "location": start_room_obj, "owner": None} odat = {"id": uid, "name": uname, "type": 1, "location": start_room_obj, "owner": None}
user_object = create_object(server, odat) user_object = create_object(odat)
# Activate the player's session and set them loose. # Activate the player's session and set them loose.
session.login(user) session.login(user)

View file

@ -20,4 +20,4 @@ NOSAVE_FLAGS = ["CONNECTED"]
NOSET_FLAGS = ["CONNECTED"] NOSET_FLAGS = ["CONNECTED"]
# These attribute names can't be modified by players. # These attribute names can't be modified by players.
NOSET_ATTRIBS = ["TEST"] NOSET_ATTRIBS = ["MONEY"]

View file

@ -10,6 +10,7 @@ from apps.objects.models import Object, Attribute
from scheduler import Scheduler from scheduler import Scheduler
import functions_db import functions_db
import functions_general import functions_general
import global_defines
class Server(dispatcher): class Server(dispatcher):
""" """
@ -38,6 +39,7 @@ class Server(dispatcher):
self.bind(('', int(self.configvalue['site_port']))) self.bind(('', int(self.configvalue['site_port'])))
self.listen(100) self.listen(100)
self.start_time = time.time() self.start_time = time.time()
print ' %s started on port %s.' % (self.configvalue['site_name'], self.configvalue['site_port'],) print ' %s started on port %s.' % (self.configvalue['site_name'], self.configvalue['site_port'],)
print '-'*50 print '-'*50

View file

@ -61,7 +61,7 @@ class PlayerSession(async_chat):
async_chat.handle_close(self) async_chat.handle_close(self)
self.logged_in = False self.logged_in = False
self.server.remove_session(self) self.server.remove_session(self)
print 'Sessions active:', len(self.server.session_list) print 'Sessions active:', len(self.server.get_session_list())
def get_pobject(self): def get_pobject(self):
""" """