Debugged and added @cpattr and @mvattr. Added unittest cases for all default commands for which they are suitable. Many small bug fixes as part of that.
This commit is contained in:
parent
7b43c4a608
commit
6f0d21802b
11 changed files with 328 additions and 155 deletions
2
LICENSE
2
LICENSE
|
|
@ -30,7 +30,7 @@ Definitions
|
||||||
|
|
||||||
5. You may charge a distribution fee for any distribution of this Package. If you offer support for this Package, you may charge any fee you choose for that support. You may not charge a license fee for the right to use this Package itself. You may distribute this Package in aggregate with other (possibly commercial and possibly nonfree) programs as part of a larger (possibly commercial and possibly nonfree) software distribution, and charge license fees for other parts of that software distribution, provided that you do not advertise this Package as a product of your own. If the Package includes an interpreter, You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded.
|
5. You may charge a distribution fee for any distribution of this Package. If you offer support for this Package, you may charge any fee you choose for that support. You may not charge a license fee for the right to use this Package itself. You may distribute this Package in aggregate with other (possibly commercial and possibly nonfree) programs as part of a larger (possibly commercial and possibly nonfree) software distribution, and charge license fees for other parts of that software distribution, provided that you do not advertise this Package as a product of your own. If the Package includes an interpreter, You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded.
|
||||||
|
|
||||||
6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package.
|
6. The scripts and library files (especially the game-specific files created for use with the Package) supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package.
|
||||||
|
|
||||||
7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language.
|
7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ class CmdSetObjAlias(MuxCommand):
|
||||||
Adding permanent aliases
|
Adding permanent aliases
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
@alias <obj> = [alias[,alias,alias,...]]
|
@alias <obj> [= [alias[,alias,alias,...]]]
|
||||||
|
|
||||||
Assigns aliases to an object so it can be referenced by more
|
Assigns aliases to an object so it can be referenced by more
|
||||||
than one name. Assign empty to remove all aliases from object.
|
than one name. Assign empty to remove all aliases from object.
|
||||||
|
|
@ -91,11 +91,15 @@ class CmdSetObjAlias(MuxCommand):
|
||||||
|
|
||||||
def func(self):
|
def func(self):
|
||||||
"Set the aliases."
|
"Set the aliases."
|
||||||
|
|
||||||
caller = self.caller
|
caller = self.caller
|
||||||
objname, aliases = self.lhs, self.rhslist
|
|
||||||
if not objname:
|
if not self.lhs:
|
||||||
caller.msg("Usage: @alias <obj> = <alias>,<alias>,...")
|
string = "Usage: @alias <obj> [= [alias[,alias ...]]]"
|
||||||
return
|
self.caller.msg(string)
|
||||||
|
return
|
||||||
|
objname = self.lhs
|
||||||
|
|
||||||
# Find the object to receive aliases
|
# Find the object to receive aliases
|
||||||
obj = caller.search(objname, global_search=True)
|
obj = caller.search(objname, global_search=True)
|
||||||
if not obj:
|
if not obj:
|
||||||
|
|
@ -108,10 +112,12 @@ class CmdSetObjAlias(MuxCommand):
|
||||||
else:
|
else:
|
||||||
caller.msg("No aliases exist for '%s'." % obj.key)
|
caller.msg("No aliases exist for '%s'." % obj.key)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not obj.access(caller, 'edit'):
|
if not obj.access(caller, 'edit'):
|
||||||
caller.msg("You don't have permission to do that.")
|
caller.msg("You don't have permission to do that.")
|
||||||
return
|
return
|
||||||
if not aliases or not aliases[0]:
|
|
||||||
|
if not self.rhs:
|
||||||
# we have given an empty =, so delete aliases
|
# we have given an empty =, so delete aliases
|
||||||
old_aliases = obj.aliases
|
old_aliases = obj.aliases
|
||||||
if old_aliases:
|
if old_aliases:
|
||||||
|
|
@ -120,10 +126,10 @@ class CmdSetObjAlias(MuxCommand):
|
||||||
else:
|
else:
|
||||||
caller.msg("No aliases to clear.")
|
caller.msg("No aliases to clear.")
|
||||||
return
|
return
|
||||||
|
|
||||||
# merge the old and new aliases (if any)
|
# merge the old and new aliases (if any)
|
||||||
old_aliases = obj.aliases
|
old_aliases = obj.aliases
|
||||||
new_aliases = [str(alias).strip().lower()
|
new_aliases = [alias.strip().lower() for alias in self.rhs.split(',') if alias.strip()]
|
||||||
for alias in aliases if alias.strip()]
|
|
||||||
# make the aliases only appear once
|
# make the aliases only appear once
|
||||||
old_aliases.extend(new_aliases)
|
old_aliases.extend(new_aliases)
|
||||||
aliases = list(set(old_aliases))
|
aliases = list(set(old_aliases))
|
||||||
|
|
@ -180,8 +186,7 @@ class CmdCopy(ObjManipCommand):
|
||||||
from_obj = caller.search(from_obj_name)
|
from_obj = caller.search(from_obj_name)
|
||||||
if not from_obj:
|
if not from_obj:
|
||||||
return
|
return
|
||||||
for objdef in self.rhs_objs:
|
for objdef in self.rhs_objs:
|
||||||
print objdef.items()
|
|
||||||
# loop through all possible copy-to targets
|
# loop through all possible copy-to targets
|
||||||
to_obj_name = objdef['name']
|
to_obj_name = objdef['name']
|
||||||
to_obj_aliases = objdef['aliases']
|
to_obj_aliases = objdef['aliases']
|
||||||
|
|
@ -202,16 +207,18 @@ class CmdCopy(ObjManipCommand):
|
||||||
# we are done, echo to user
|
# we are done, echo to user
|
||||||
caller.msg(string)
|
caller.msg(string)
|
||||||
|
|
||||||
# NOT YET INCLUDED IN SET.
|
class CmdCpAttr(ObjManipCommand):
|
||||||
class CmdCpAttr(MuxCommand):
|
|
||||||
"""
|
"""
|
||||||
@cpattr - copy attributes
|
@cpattr - copy attributes
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
@cpattr <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
@cpattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
@cpattr <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
|
@cpattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
|
||||||
@cpattr <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
@cpattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
@cpattr <attr> = <obj1>[,<obj2>,<obj3>,...]
|
@cpattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]
|
||||||
|
|
||||||
|
Switches:
|
||||||
|
move - delete the attribute from the source object after copying.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
@cpattr coolness = Anna/chillout, Anna/nicety, Tom/nicety
|
@cpattr coolness = Anna/chillout, Anna/nicety, Tom/nicety
|
||||||
|
|
@ -219,7 +226,8 @@ class CmdCpAttr(MuxCommand):
|
||||||
copies the coolness attribute (defined on yourself), to attributes
|
copies the coolness attribute (defined on yourself), to attributes
|
||||||
on Anna and Tom.
|
on Anna and Tom.
|
||||||
|
|
||||||
Copy the attribute one object to one or more attributes on another object.
|
Copy the attribute one object to one or more attributes on another object. If
|
||||||
|
you don't supply a source object, yourself is used.
|
||||||
"""
|
"""
|
||||||
key = "@cpattr"
|
key = "@cpattr"
|
||||||
locks = "cmd:perm(cpattr) or perm(Builders)"
|
locks = "cmd:perm(cpattr) or perm(Builders)"
|
||||||
|
|
@ -233,10 +241,10 @@ class CmdCpAttr(MuxCommand):
|
||||||
|
|
||||||
if not self.rhs:
|
if not self.rhs:
|
||||||
string = """Usage:
|
string = """Usage:
|
||||||
@cpattr <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
@cpattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
@cpattr <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
|
@cpattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
|
||||||
@cpattr <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
@cpattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
@cpattr <attr> = <obj1>[,<obj2>,<obj3>,...]"""
|
@cpattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]"""
|
||||||
caller.msg(string)
|
caller.msg(string)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
@ -248,19 +256,26 @@ class CmdCpAttr(MuxCommand):
|
||||||
if not from_obj_attrs:
|
if not from_obj_attrs:
|
||||||
# this means the from_obj_name is actually an attribute name on self.
|
# this means the from_obj_name is actually an attribute name on self.
|
||||||
from_obj_attrs = [from_obj_name]
|
from_obj_attrs = [from_obj_name]
|
||||||
from_obj = self
|
from_obj = self.caller
|
||||||
from_obj_name = self.name
|
from_obj_name = self.caller.name
|
||||||
else:
|
else:
|
||||||
from_obj = caller.search(from_obj_name)
|
from_obj = caller.search(from_obj_name)
|
||||||
if not from_obj or not to_objs:
|
if not from_obj or not to_objs:
|
||||||
caller.msg("Have to supply both source object and target(s).")
|
caller.msg("You have to supply both source object and target(s).")
|
||||||
return
|
return
|
||||||
srcvalue = from_obj.attr(from_obj_attrs[0])
|
if not from_obj.has_attribute(from_obj_attrs[0]):
|
||||||
|
caller.msg("%s doesn't have an attribute %s." % (from_obj_name, from_obj_attrs[0]))
|
||||||
|
return
|
||||||
|
srcvalue = from_obj.get_attribute(from_obj_attrs[0])
|
||||||
|
|
||||||
#copy to all to_obj:ects
|
#copy to all to_obj:ects
|
||||||
string = "Copying %s=%s (with value %s) ..." % (from_obj_name,
|
if "move" in self.switches:
|
||||||
from_obj_attrs[0], srcvalue)
|
string = "Moving "
|
||||||
for to_obj in to_objs:
|
else:
|
||||||
|
string = "Copying "
|
||||||
|
string += "%s/%s (with value %s) ..." % (from_obj_name, from_obj_attrs[0], srcvalue)
|
||||||
|
|
||||||
|
for to_obj in to_objs:
|
||||||
to_obj_name = to_obj['name']
|
to_obj_name = to_obj['name']
|
||||||
to_obj_attrs = to_obj['attrs']
|
to_obj_attrs = to_obj['attrs']
|
||||||
to_obj = caller.search(to_obj_name)
|
to_obj = caller.search(to_obj_name)
|
||||||
|
|
@ -274,12 +289,54 @@ class CmdCpAttr(MuxCommand):
|
||||||
# if there are too few attributes given
|
# if there are too few attributes given
|
||||||
# on the to_obj, we copy the original name instead.
|
# on the to_obj, we copy the original name instead.
|
||||||
to_attr = from_attr
|
to_attr = from_attr
|
||||||
to_obj.attr(to_attr, srcvalue)
|
to_obj.set_attribute(to_attr, srcvalue)
|
||||||
string += "\nCopied %s.%s -> %s.%s." % (from_obj.name, from_attr,
|
if "move" in self.switches and not (from_obj == to_obj and from_attr == to_attr):
|
||||||
to_obj_name, to_attr)
|
from_obj.del_attribute(from_attr)
|
||||||
|
string += "\nMoved %s.%s -> %s.%s." % (from_obj.name, from_attr,
|
||||||
|
to_obj_name, to_attr)
|
||||||
|
else:
|
||||||
|
string += "\nCopied %s.%s -> %s.%s." % (from_obj.name, from_attr,
|
||||||
|
to_obj_name, to_attr)
|
||||||
caller.msg(string)
|
caller.msg(string)
|
||||||
|
|
||||||
|
class CmdMvAttr(ObjManipCommand):
|
||||||
|
"""
|
||||||
|
@mvattr - move attributes
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
@mvattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
|
@mvattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
|
||||||
|
@mvattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
|
@mvattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]
|
||||||
|
|
||||||
|
Switches:
|
||||||
|
copy - Don't delete the original after moving.
|
||||||
|
|
||||||
|
Move an attribute from one object to one or more attributes on another object. If
|
||||||
|
you don't supply a source object, yourself is used.
|
||||||
|
"""
|
||||||
|
key = "@mvattr"
|
||||||
|
locks = "cmd:perm(mvattr) or perm(Builders)"
|
||||||
|
help_category = "Building"
|
||||||
|
|
||||||
|
def func(self):
|
||||||
|
"""
|
||||||
|
Do the moving
|
||||||
|
"""
|
||||||
|
if not self.rhs:
|
||||||
|
string = """Usage:
|
||||||
|
@mvattr[/switch] <obj>/<attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
|
@mvattr[/switch] <obj>/<attr> = <obj1> [,<obj2>,<obj3>,...]
|
||||||
|
@mvattr[/switch] <attr> = <obj1>/<attr1> [,<obj2>/<attr2>,<obj3>/<attr3>,...]
|
||||||
|
@mvattr[/switch] <attr> = <obj1>[,<obj2>,<obj3>,...]"""
|
||||||
|
self.caller.msg(string)
|
||||||
|
return
|
||||||
|
|
||||||
|
# simply use @cpattr for all the functionality
|
||||||
|
if "copy" in self.switches:
|
||||||
|
self.caller.execute_cmd("@cpattr %s" % self.args)
|
||||||
|
else:
|
||||||
|
self.caller.execute_cmd("@cpattr/move %s" % self.args)
|
||||||
|
|
||||||
class CmdCreate(ObjManipCommand):
|
class CmdCreate(ObjManipCommand):
|
||||||
"""
|
"""
|
||||||
|
|
@ -492,20 +549,21 @@ class CmdDestroy(MuxCommand):
|
||||||
for objname in self.lhslist:
|
for objname in self.lhslist:
|
||||||
obj = caller.search(objname)
|
obj = caller.search(objname)
|
||||||
if not obj:
|
if not obj:
|
||||||
continue
|
self.caller.msg(" (Objects to destroy must either be local or specified with a unique dbref.)")
|
||||||
|
return
|
||||||
objname = obj.name
|
objname = obj.name
|
||||||
if not obj.access(caller, 'delete'):
|
if not obj.access(caller, 'delete'):
|
||||||
string = "You don't have permission to delete %s." % objname
|
string += "\nYou don't have permission to delete %s." % objname
|
||||||
continue
|
continue
|
||||||
if obj.player and not 'override' in self.switches:
|
if obj.player and not 'override' in self.switches:
|
||||||
string = "Object %s is controlled by an active player. Use /override to delete anyway." % objname
|
string += "\nObject %s is controlled by an active player. Use /override to delete anyway." % objname
|
||||||
continue
|
continue
|
||||||
# do the deletion
|
# do the deletion
|
||||||
okay = obj.delete()
|
okay = obj.delete()
|
||||||
if not okay:
|
if not okay:
|
||||||
string = "ERROR: %s NOT deleted, probably because at_obj_delete() returned False." % objname
|
string += "\nERROR: %s not deleted, probably because at_obj_delete() returned False." % objname
|
||||||
else:
|
else:
|
||||||
string = "%s was deleted." % objname
|
string += "\n%s was deleted." % objname
|
||||||
if string:
|
if string:
|
||||||
caller.msg(string.strip())
|
caller.msg(string.strip())
|
||||||
|
|
||||||
|
|
@ -659,7 +717,7 @@ class CmdLink(MuxCommand):
|
||||||
@link[/switches] <object>
|
@link[/switches] <object>
|
||||||
|
|
||||||
Switch:
|
Switch:
|
||||||
twoway - connect two exits. For this to, BOTH <object>
|
twoway - connect two exits. For this to work, BOTH <object>
|
||||||
and <target> must be exit objects.
|
and <target> must be exit objects.
|
||||||
|
|
||||||
If <object> is an exit, set its destination to <target>. Two-way operation
|
If <object> is an exit, set its destination to <target>. Two-way operation
|
||||||
|
|
@ -803,7 +861,7 @@ class CmdHome(CmdLink):
|
||||||
if not home:
|
if not home:
|
||||||
string = "This object has no home location set!"
|
string = "This object has no home location set!"
|
||||||
else:
|
else:
|
||||||
string = "%s's home is set to %s(%s)." % (obj, home, home.dbref)
|
string = "%s's current home is %s(%s)." % (obj, home, home.dbref)
|
||||||
else:
|
else:
|
||||||
# set a home location
|
# set a home location
|
||||||
new_home = self.caller.search(self.rhs, global_search=True)
|
new_home = self.caller.search(self.rhs, global_search=True)
|
||||||
|
|
@ -845,79 +903,6 @@ class CmdListCmdSets(MuxCommand):
|
||||||
string = "%s" % obj.cmdset
|
string = "%s" % obj.cmdset
|
||||||
caller.msg(string)
|
caller.msg(string)
|
||||||
|
|
||||||
|
|
||||||
class CmdMvAttr(ObjManipCommand):
|
|
||||||
"""
|
|
||||||
@mvattr - move attributes
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
@mvattr <srcobject>/attr[/attr/attr...] = <targetobject>[/attr/attr/...]
|
|
||||||
|
|
||||||
Moves attributes around. If the target object's attribute names are given,
|
|
||||||
the source attributes will be moved into those attributes instead. The
|
|
||||||
old attribute(s) will be deleted from the source object (unless source
|
|
||||||
and target are the same, in which case this is like a copy operation)
|
|
||||||
"""
|
|
||||||
key = "@mvattr"
|
|
||||||
locks = "cmd:perm(mvattr) or perm(Builders)"
|
|
||||||
help_category = "Building"
|
|
||||||
|
|
||||||
def func(self):
|
|
||||||
"We use the parsed values from ObjManipCommand.parse()."
|
|
||||||
|
|
||||||
caller = self.caller
|
|
||||||
|
|
||||||
if not self.lhs or not self.rhs:
|
|
||||||
caller.msg("Usage: @mvattr <src>/attr[/attr/..] = <target>[/attr/attr..]")
|
|
||||||
return
|
|
||||||
|
|
||||||
from_obj_name = self.lhs_objattr[0]['name']
|
|
||||||
from_obj_attrs = self.lhs_objattr[0]['attrs']
|
|
||||||
to_obj_name = self.rhs_objattr[0]['name']
|
|
||||||
to_obj_attrs = self.rhs_objattr[0]['name']
|
|
||||||
|
|
||||||
# find from-object
|
|
||||||
from_obj = caller.search(from_obj_name)
|
|
||||||
if not from_obj:
|
|
||||||
return
|
|
||||||
#find to-object
|
|
||||||
to_obj = caller.search_for_object(to_obj_name)
|
|
||||||
if not to_obj:
|
|
||||||
return
|
|
||||||
|
|
||||||
# if we copy on the same object, we have to
|
|
||||||
# be more careful.
|
|
||||||
same_object = to_obj == from_obj
|
|
||||||
|
|
||||||
#do the moving
|
|
||||||
string = ""
|
|
||||||
for inum, from_attr in enumerate(from_obj_attrs):
|
|
||||||
from_value = from_obj.attr(from_attr)
|
|
||||||
if not from_value:
|
|
||||||
string += "\nAttribute '%s' not found on source object %s."
|
|
||||||
string = string % (from_attr, from_obj.name)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
to_attr = to_obj_attrs[inum]
|
|
||||||
except KeyError:
|
|
||||||
# too few attributes on the target, so we add the
|
|
||||||
# source attrname instead
|
|
||||||
if same_object:
|
|
||||||
# we can't do that on the same object though,
|
|
||||||
# it would be just copying to itself.
|
|
||||||
string += "\nToo few attribute names on target, and "
|
|
||||||
string += "can't copy same-named attribute to itself."
|
|
||||||
continue
|
|
||||||
to_attr = from_attr
|
|
||||||
# Do the move
|
|
||||||
to_obj.attr(to_attr, from_value)
|
|
||||||
from_obj.attr(from_attr, delete=True)
|
|
||||||
string += "\nMoved %s.%s -> %s.%s." % (from_obj_name, from_attr,
|
|
||||||
to_obj_name, to_attr)
|
|
||||||
caller.msg(string)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CmdName(ObjManipCommand):
|
class CmdName(ObjManipCommand):
|
||||||
"""
|
"""
|
||||||
cname - change the name and/or aliases of an object
|
cname - change the name and/or aliases of an object
|
||||||
|
|
@ -1410,7 +1395,7 @@ class CmdExamine(ObjManipCommand):
|
||||||
If object is not specified, the current location is examined.
|
If object is not specified, the current location is examined.
|
||||||
"""
|
"""
|
||||||
key = "@examine"
|
key = "@examine"
|
||||||
aliases = ["@ex","ex", "exam"]
|
aliases = ["@ex","ex", "exam", "examine"]
|
||||||
locks = "cmd:perm(examine) or perm(Builders)"
|
locks = "cmd:perm(examine) or perm(Builders)"
|
||||||
help_category = "Building"
|
help_category = "Building"
|
||||||
|
|
||||||
|
|
@ -1617,7 +1602,7 @@ class CmdFind(MuxCommand):
|
||||||
else:
|
else:
|
||||||
# Not a player/dbref search but a wider search; build a queryset.
|
# Not a player/dbref search but a wider search; build a queryset.
|
||||||
|
|
||||||
results = ObjectDB.objects.filter(db_key__istartswith=searchstring, id__gte=low, id__lte=high)
|
results = ObjectDB.objects.filter(db_key__istartswith=searchstring, id__gte=low, id__lte=high)
|
||||||
if "room" in switches:
|
if "room" in switches:
|
||||||
results = results.filter(db_location__isnull=True)
|
results = results.filter(db_location__isnull=True)
|
||||||
if "exit" in switches:
|
if "exit" in switches:
|
||||||
|
|
@ -1625,11 +1610,24 @@ class CmdFind(MuxCommand):
|
||||||
if "char" in switches:
|
if "char" in switches:
|
||||||
results = results.filter(db_typeclass_path=CHAR_TYPECLASS)
|
results = results.filter(db_typeclass_path=CHAR_TYPECLASS)
|
||||||
nresults = results.count()
|
nresults = results.count()
|
||||||
|
if not nresults:
|
||||||
|
# no matches on the keys. Try aliases instead.
|
||||||
|
results = results = ObjectDB.alias_set.related.model.objects.filter(db_key=searchstring)
|
||||||
|
if "room" in switches:
|
||||||
|
results = results.filter(db_obj__db_location__isnull=True)
|
||||||
|
if "exit" in switches:
|
||||||
|
results = results.filter(db_obj__db_destination__isnull=False)
|
||||||
|
if "char" in switches:
|
||||||
|
results = results.filter(db_obj__db_typeclass_path=CHAR_TYPECLASS)
|
||||||
|
# we have to parse alias -> real object here
|
||||||
|
results = [result.db_obj for result in results]
|
||||||
|
nresults = len(results)
|
||||||
|
|
||||||
restrictions = ""
|
restrictions = ""
|
||||||
if self.switches:
|
if self.switches:
|
||||||
restrictions = ", %s" % (",".join(self.switches))
|
restrictions = ", %s" % (",".join(self.switches))
|
||||||
if nresults:
|
if nresults:
|
||||||
# convert result to typeclasses. Database is not hit until this point!
|
# convert result to typeclasses.
|
||||||
results = [result.typeclass(result) for result in results]
|
results = [result.typeclass(result) for result in results]
|
||||||
if nresults > 1:
|
if nresults > 1:
|
||||||
string = "{w%i Matches{n(#%i-#%i%s):" % (nresults, low, high, restrictions)
|
string = "{w%i Matches{n(#%i-#%i%s):" % (nresults, low, high, restrictions)
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,10 @@ class DefaultCmdSet(CmdSet):
|
||||||
self.add(building.CmdSetAttribute())
|
self.add(building.CmdSetAttribute())
|
||||||
self.add(building.CmdName())
|
self.add(building.CmdName())
|
||||||
self.add(building.CmdDesc())
|
self.add(building.CmdDesc())
|
||||||
#self.add(building.CmdCpAttr()) #TODO - need testing/debugging
|
self.add(building.CmdCpAttr())
|
||||||
#self.add(building.CmdMvAttr()) #TODO - need testing/debugging
|
self.add(building.CmdMvAttr())
|
||||||
|
self.add(building.CmdCopy())
|
||||||
self.add(building.CmdFind())
|
self.add(building.CmdFind())
|
||||||
self.add(building.CmdCopy()) #TODO - need testing/debugging
|
|
||||||
self.add(building.CmdOpen())
|
self.add(building.CmdOpen())
|
||||||
self.add(building.CmdLink())
|
self.add(building.CmdLink())
|
||||||
self.add(building.CmdUnLink())
|
self.add(building.CmdUnLink())
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,15 @@ from src.utils import create, utils
|
||||||
from src.commands.default.muxcommand import MuxCommand
|
from src.commands.default.muxcommand import MuxCommand
|
||||||
from src.server.sessionhandler import SESSIONS
|
from src.server.sessionhandler import SESSIONS
|
||||||
|
|
||||||
def find_channel(caller, channelname, silent=False):
|
def find_channel(caller, channelname, silent=False, noaliases=False):
|
||||||
"""
|
"""
|
||||||
Helper function for searching for a single channel with
|
Helper function for searching for a single channel with
|
||||||
some error handling.
|
some error handling.
|
||||||
"""
|
"""
|
||||||
channels = Channel.objects.channel_search(channelname)
|
channels = Channel.objects.channel_search(channelname)
|
||||||
if not channels:
|
if not channels:
|
||||||
channels = [chan for chan in Channel.objects.all() if channelname in chan.aliases]
|
if not noaliases:
|
||||||
|
channels = [chan for chan in Channel.objects.all() if channelname in chan.aliases]
|
||||||
if channels:
|
if channels:
|
||||||
return channels[0]
|
return channels[0]
|
||||||
if not silent:
|
if not silent:
|
||||||
|
|
@ -126,7 +127,7 @@ class CmdDelCom(MuxCommand):
|
||||||
return
|
return
|
||||||
ostring = self.args.lower()
|
ostring = self.args.lower()
|
||||||
|
|
||||||
channel = find_channel(caller, ostring, silent=True)
|
channel = find_channel(caller, ostring, silent=True, noaliases=True)
|
||||||
if channel:
|
if channel:
|
||||||
# we have given a channel name - unsubscribe
|
# we have given a channel name - unsubscribe
|
||||||
if not channel.has_connection(player):
|
if not channel.has_connection(player):
|
||||||
|
|
@ -147,9 +148,12 @@ class CmdDelCom(MuxCommand):
|
||||||
if not channel:
|
if not channel:
|
||||||
caller.msg("No channel with alias '%s' was found." % ostring)
|
caller.msg("No channel with alias '%s' was found." % ostring)
|
||||||
else:
|
else:
|
||||||
caller.nicks.delete(ostring, nick_type="channel")
|
if caller.nicks.has(ostring, nick_type="channel"):
|
||||||
caller.msg("Your alias '%s' for channel %s was cleared." % (ostring, channel.key))
|
caller.nicks.delete(ostring, nick_type="channel")
|
||||||
|
caller.msg("Your alias '%s' for channel %s was cleared." % (ostring, channel.key))
|
||||||
|
else:
|
||||||
|
caller.msg("You had no such alias defined for this channel.")
|
||||||
|
|
||||||
class CmdAllCom(MuxCommand):
|
class CmdAllCom(MuxCommand):
|
||||||
"""
|
"""
|
||||||
allcom - operate on all channels
|
allcom - operate on all channels
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ from src.utils import create, ansi
|
||||||
from src.server import session, sessionhandler
|
from src.server import session, sessionhandler
|
||||||
from src.locks.lockhandler import LockHandler
|
from src.locks.lockhandler import LockHandler
|
||||||
from src.server.models import ServerConfig
|
from src.server.models import ServerConfig
|
||||||
|
from src.comms.models import Channel, Msg, PlayerChannelConnection
|
||||||
|
|
||||||
#------------------------------------------------------------
|
#------------------------------------------------------------
|
||||||
# Command testing
|
# Command testing
|
||||||
|
|
@ -30,7 +31,6 @@ from src.server.models import ServerConfig
|
||||||
|
|
||||||
# print all feedback from test commands (can become very verbose!)
|
# print all feedback from test commands (can become very verbose!)
|
||||||
VERBOSE = False
|
VERBOSE = False
|
||||||
NOMANGLE = False
|
|
||||||
|
|
||||||
class FakeSession(session.Session):
|
class FakeSession(session.Session):
|
||||||
"""
|
"""
|
||||||
|
|
@ -75,6 +75,9 @@ class CommandTest(TestCase):
|
||||||
|
|
||||||
Inherit new tests from this.
|
Inherit new tests from this.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
NOMANGLE = False # mangle command input for extra testing
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"sets up the testing environment"
|
"sets up the testing environment"
|
||||||
ServerConfig.objects.conf("default_home", 2)
|
ServerConfig.objects.conf("default_home", 2)
|
||||||
|
|
@ -107,7 +110,7 @@ class CommandTest(TestCase):
|
||||||
self.obj2 = create.create_object(settings.BASE_OBJECT_TYPECLASS, key="obj2", location=self.room1)
|
self.obj2 = create.create_object(settings.BASE_OBJECT_TYPECLASS, key="obj2", location=self.room1)
|
||||||
self.exit1 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit1", location=self.room1)
|
self.exit1 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit1", location=self.room1)
|
||||||
self.exit2 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit2", location=self.room2)
|
self.exit2 = create.create_object(settings.BASE_EXIT_TYPECLASS, key="exit2", location=self.room2)
|
||||||
|
|
||||||
def get_cmd(self, cmd_class, argument_string=""):
|
def get_cmd(self, cmd_class, argument_string=""):
|
||||||
"""
|
"""
|
||||||
Obtain a cmd instance from a class and an input string
|
Obtain a cmd instance from a class and an input string
|
||||||
|
|
@ -121,13 +124,13 @@ class CommandTest(TestCase):
|
||||||
cmd.obj = self.char1
|
cmd.obj = self.char1
|
||||||
return cmd
|
return cmd
|
||||||
|
|
||||||
def execute_cmd(self, raw_string, wanted_return_string=None):
|
def execute_cmd(self, raw_string, wanted_return_string=None, nomangle=False):
|
||||||
"""
|
"""
|
||||||
Creates the command through faking a normal command call;
|
Creates the command through faking a normal command call;
|
||||||
This also mangles the input in various ways to test if the command
|
This also mangles the input in various ways to test if the command
|
||||||
will be fooled.
|
will be fooled.
|
||||||
"""
|
"""
|
||||||
if not VERBOSE and not NOMANGLE:
|
if not nomangle and not VERBOSE and not self.NOMANGLE:
|
||||||
# only mangle if not VERBOSE, to make fewer return lines
|
# only mangle if not VERBOSE, to make fewer return lines
|
||||||
test1 = re.sub(r'\s', '', raw_string) # remove all whitespace inside it
|
test1 = re.sub(r'\s', '', raw_string) # remove all whitespace inside it
|
||||||
test2 = "%s/åäö öäö;-:$£@*~^' 'test" % raw_string # inserting weird characters in call
|
test2 = "%s/åäö öäö;-:$£@*~^' 'test" % raw_string # inserting weird characters in call
|
||||||
|
|
@ -142,11 +145,21 @@ class CommandTest(TestCase):
|
||||||
except AssertionError, e:
|
except AssertionError, e:
|
||||||
self.fail(e)
|
self.fail(e)
|
||||||
self.char1.ndb.return_string = None
|
self.char1.ndb.return_string = None
|
||||||
|
|
||||||
|
class BuildTest(CommandTest):
|
||||||
|
"""
|
||||||
|
We need to turn of mangling for build commands since
|
||||||
|
it creates arbitrary objects that mess up tests later.
|
||||||
|
"""
|
||||||
|
NOMANGLE = True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#------------------------------------------------------------
|
#------------------------------------------------------------
|
||||||
# Default set Command testing
|
# Default set Command testing
|
||||||
#------------------------------------------------------------
|
#------------------------------------------------------------
|
||||||
|
|
||||||
# general.py tests
|
# # general.py tests
|
||||||
|
|
||||||
class TestLook(CommandTest):
|
class TestLook(CommandTest):
|
||||||
def test_call(self):
|
def test_call(self):
|
||||||
|
|
@ -175,9 +188,9 @@ class TestNick(CommandTest):
|
||||||
self.execute_cmd("nickname testalias = testaliasedstring1")
|
self.execute_cmd("nickname testalias = testaliasedstring1")
|
||||||
self.execute_cmd("nickname/player testalias = testaliasedstring2")
|
self.execute_cmd("nickname/player testalias = testaliasedstring2")
|
||||||
self.execute_cmd("nickname/object testalias = testaliasedstring3")
|
self.execute_cmd("nickname/object testalias = testaliasedstring3")
|
||||||
self.assertEquals(u"testaliasedstring1", self.char1.nicks.get("testalias"))
|
self.assertEqual(u"testaliasedstring1", self.char1.nicks.get("testalias"))
|
||||||
self.assertEquals(u"testaliasedstring2", self.char1.nicks.get("testalias",nick_type="player"))
|
self.assertEqual(u"testaliasedstring2", self.char1.nicks.get("testalias",nick_type="player"))
|
||||||
self.assertEquals(u"testaliasedstring3", self.char1.nicks.get("testalias",nick_type="object"))
|
self.assertEqual(u"testaliasedstring3", self.char1.nicks.get("testalias",nick_type="object"))
|
||||||
class TestGet(CommandTest):
|
class TestGet(CommandTest):
|
||||||
def test_call(self):
|
def test_call(self):
|
||||||
self.obj1.location = self.room1
|
self.obj1.location = self.room1
|
||||||
|
|
@ -207,8 +220,7 @@ class TestEncoding(CommandTest):
|
||||||
|
|
||||||
class TestHelpSystem(CommandTest):
|
class TestHelpSystem(CommandTest):
|
||||||
def test_call(self):
|
def test_call(self):
|
||||||
global NOMANGLE
|
self.NOMANGLE = True
|
||||||
NOMANGLE = True
|
|
||||||
sep = "-"*78 + "\n"
|
sep = "-"*78 + "\n"
|
||||||
self.execute_cmd("@help/add TestTopic,TestCategory = Test1", )
|
self.execute_cmd("@help/add TestTopic,TestCategory = Test1", )
|
||||||
self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1" + "\n" + sep)
|
self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1" + "\n" + sep)
|
||||||
|
|
@ -218,7 +230,6 @@ class TestHelpSystem(CommandTest):
|
||||||
self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1 Test2\n\nTest3")
|
self.execute_cmd("help TestTopic",sep + "Help topic for Testtopic\nTest1 Test2\n\nTest3")
|
||||||
self.execute_cmd("@help/delete TestTopic","Deleted the help entry")
|
self.execute_cmd("@help/delete TestTopic","Deleted the help entry")
|
||||||
self.execute_cmd("help TestTopic","No help entry found for 'TestTopic'")
|
self.execute_cmd("help TestTopic","No help entry found for 'TestTopic'")
|
||||||
NOMANGLE = False
|
|
||||||
|
|
||||||
# system.py command tests
|
# system.py command tests
|
||||||
class TestPy(CommandTest):
|
class TestPy(CommandTest):
|
||||||
|
|
@ -265,7 +276,7 @@ class TestUserPassword(CommandTest):
|
||||||
class TestPerm(CommandTest):
|
class TestPerm(CommandTest):
|
||||||
def test_call(self):
|
def test_call(self):
|
||||||
self.execute_cmd("@perm TestChar2 = Builders", "Permission 'Builders' given to")
|
self.execute_cmd("@perm TestChar2 = Builders", "Permission 'Builders' given to")
|
||||||
# cannot test this at the moment, screws up the test suite
|
# cannot test this here; screws up the test suite
|
||||||
#class TestPuppet(CommandTest):
|
#class TestPuppet(CommandTest):
|
||||||
# def test_call(self):
|
# def test_call(self):
|
||||||
# self.execute_cmd("@puppet TestChar3", "You now control TestChar3.")
|
# self.execute_cmd("@puppet TestChar3", "You now control TestChar3.")
|
||||||
|
|
@ -274,10 +285,161 @@ class TestWall(CommandTest):
|
||||||
def test_call(self):
|
def test_call(self):
|
||||||
self.execute_cmd("@wall = This is a test message", "TestChar shouts")
|
self.execute_cmd("@wall = This is a test message", "TestChar shouts")
|
||||||
|
|
||||||
|
|
||||||
# building.py command tests
|
# building.py command tests
|
||||||
|
|
||||||
class TestScript(CommandTest):
|
class TestObjAlias(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@alias obj1 = obj1alias, obj1alias2", "Aliases for")
|
||||||
|
self.execute_cmd("look obj1alias2", "obj1")
|
||||||
|
class TestCopy(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@copy obj1 = obj1_copy;alias1;alias2", "Copied obj1 to 'obj1_copy'")
|
||||||
|
self.execute_cmd("look alias2","obj1_copy")
|
||||||
|
class TestSet(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@set obj1/test = value", "Created attribute obj1/test = value")
|
||||||
|
self.execute_cmd("@set obj1/test", "Attribute obj1/test = value")
|
||||||
|
self.assertEqual(self.obj1.db.test, u"value")
|
||||||
|
class TestCpAttr(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@set obj1/test = value")
|
||||||
|
self.execute_cmd("@set me/test2 = value2")
|
||||||
|
self.execute_cmd("@cpattr obj1/test = obj2/test")
|
||||||
|
self.execute_cmd("@cpattr test2 = obj2")
|
||||||
|
self.assertEqual(self.obj2.db.test, u"value")
|
||||||
|
self.assertEqual(self.obj2.db.test2, u"value2")
|
||||||
|
class TestMvAttr(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@set obj1/test = value")
|
||||||
|
self.execute_cmd("@mvattr obj1/test = obj2")
|
||||||
|
self.assertEqual(self.obj2.db.test, u"value")
|
||||||
|
self.assertEqual(self.obj1.db.test, None)
|
||||||
|
class TestCreate(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@create testobj;alias1;alias2")
|
||||||
|
self.execute_cmd("look alias1", "testobj")
|
||||||
|
class TestDebug(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@debug/obj obj1")
|
||||||
|
class TestDesc(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@desc obj1 = Test object", "The description was set on")
|
||||||
|
self.assertEqual(self.obj1.db.desc, u"Test object")
|
||||||
|
class TestDestroy(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@destroy obj1, obj2", "obj1 was deleted.\nobj2 was deleted")
|
||||||
|
class TestFind(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@find obj1", "One Match")
|
||||||
|
class TestDig(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@dig room3;roomalias1;roomalias2 = north;n,south;s")
|
||||||
|
self.execute_cmd("@find room3", "One Match")
|
||||||
|
self.execute_cmd("@find roomalias1", "One Match")
|
||||||
|
self.execute_cmd("@find roomalias2", "One Match")
|
||||||
|
self.execute_cmd("@find/room roomalias2", "One Match")
|
||||||
|
self.execute_cmd("@find/exit south", "One Match")
|
||||||
|
self.execute_cmd("@find/exit n", "One Match")
|
||||||
|
class TestUnLink(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@dig room3;roomalias1, north, south")
|
||||||
|
self.execute_cmd("@unlink north")
|
||||||
|
class TestLink(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@dig room3;roomalias1, north, south")
|
||||||
|
self.execute_cmd("@unlink north")
|
||||||
|
self.execute_cmd("@link north = room3")
|
||||||
|
class TestHome(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.obj1.db_home = self.obj2.dbobj
|
||||||
|
self.obj1.save()
|
||||||
|
self.execute_cmd("@home obj1")
|
||||||
|
self.assertEqual(self.obj1.db_home, self.obj2.dbobj)
|
||||||
|
class TestCmdSets(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@cmdsets")
|
||||||
|
self.execute_cmd("@cmdsets obj1")
|
||||||
|
class TestDesc(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@name obj1 = Test object", "Object's name changed to 'Test object'.")
|
||||||
|
self.assertEqual(self.obj1.key, u"Test object")
|
||||||
|
class TestOpen(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@dig room4;roomalias4")
|
||||||
|
self.execute_cmd("@open testexit4;aliasexit4 = roomalias4", "Created new Exit")
|
||||||
|
class TestScript(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@typeclass obj1 = src.objects.objects.Character", "obj's type is now")
|
||||||
|
self.assertEqual(self.obj1.db_typeclass_path, u"src.objects.objects.Character")
|
||||||
|
class TestScript(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@set box1/test = value")
|
||||||
|
self.execute_cmd("@wipe box1", "Wiped")
|
||||||
|
self.assertEqual(self.obj1.db.all(), [])
|
||||||
|
class TestLock(BuildTest):
|
||||||
|
# lock functionality itseld is tested separately
|
||||||
|
def test_call(self):
|
||||||
|
self.char1.permissions = ["TestPerm"]
|
||||||
|
self.execute_cmd("@lock obj1 = test:perm(TestPerm)")
|
||||||
|
self.assertEqual(True, self.obj1.access(self.char1, u"test"))
|
||||||
|
class TestExamine(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("examine obj1", "------------")
|
||||||
|
class TestTeleport(BuildTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@tel obj1 = obj2")
|
||||||
|
self.assertEqual(self.obj1.location, self.obj2.dbobj)
|
||||||
|
class TestScript(BuildTest):
|
||||||
def test_call(self):
|
def test_call(self):
|
||||||
self.execute_cmd("@script TestChar = examples.bodyfunctions.BodyFunctions", "Script successfully added")
|
self.execute_cmd("@script TestChar = examples.bodyfunctions.BodyFunctions", "Script successfully added")
|
||||||
|
|
||||||
#TODO
|
# Comms commands
|
||||||
|
|
||||||
|
class TestChannelCreate(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("testchan1 Hello", "[testchannel1] TestChar: Hello")
|
||||||
|
class TestAddCom(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("addcom chan1 = testchannel1")
|
||||||
|
self.execute_cmd("addcom chan2 = testchan1")
|
||||||
|
self.execute_cmd("delcom testchannel1")
|
||||||
|
self.execute_cmd("addcom testchannel1" "You now listen to the channel channel.")
|
||||||
|
|
||||||
|
class TestDelCom(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("addcom chan1 = testchan1")
|
||||||
|
self.execute_cmd("addcom chan2 = testchan1b")
|
||||||
|
self.execute_cmd("addcom chan3 = testchannel1")
|
||||||
|
self.execute_cmd("delcom chan1", "Your alias 'chan1' for ")
|
||||||
|
self.execute_cmd("delcom chan2", "Your alias 'chan2' for ")
|
||||||
|
self.execute_cmd("delcom testchannel1" "You stop listening to")
|
||||||
|
class TestAllCom(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("allcom off")
|
||||||
|
self.execute_cmd("allcom on")
|
||||||
|
self.execute_cmd("allcom destroy")
|
||||||
|
class TestChannels(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("@cdestroy testchannel1", "Channel 'testchannel1'")
|
||||||
|
class TestCBoot(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("@cboot testchannel1 = TestChar", "TestChar boots TestChar from channel.")
|
||||||
|
class TestCemit(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("@cemit testchan1 = Testing!", "[testchannel1] Testing!")
|
||||||
|
class TestCwho(CommandTest):
|
||||||
|
def test_call(self):
|
||||||
|
self.execute_cmd("@ccreate testchannel1;testchan1;testchan1b = This is a test channel")
|
||||||
|
self.execute_cmd("@cwho testchan1b", "Channel subscriptions")
|
||||||
|
|
||||||
|
# Unloggedin commands
|
||||||
|
# these cannot be tested from here.
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ from django.contrib.auth.models import User
|
||||||
from django.db.models.fields import exceptions
|
from django.db.models.fields import exceptions
|
||||||
from src.typeclasses.managers import TypedObjectManager
|
from src.typeclasses.managers import TypedObjectManager
|
||||||
from src.typeclasses.managers import returns_typeclass, returns_typeclass_list
|
from src.typeclasses.managers import returns_typeclass, returns_typeclass_list
|
||||||
|
from src.utils import utils
|
||||||
|
|
||||||
# Try to use a custom way to parse id-tagged multimatches.
|
# Try to use a custom way to parse id-tagged multimatches.
|
||||||
IDPARSER_PATH = getattr(settings, 'ALTERNATE_OBJECT_SEARCH_MULTIMATCH_PARSER', 'src.objects.object_search_funcs')
|
IDPARSER_PATH = getattr(settings, 'ALTERNATE_OBJECT_SEARCH_MULTIMATCH_PARSER', 'src.objects.object_search_funcs')
|
||||||
|
|
@ -60,7 +61,7 @@ class ObjectManager(TypedObjectManager):
|
||||||
the search criterion (e.g. in local_and_global_search).
|
the search criterion (e.g. in local_and_global_search).
|
||||||
search_string: (string) The name or dbref to search for.
|
search_string: (string) The name or dbref to search for.
|
||||||
"""
|
"""
|
||||||
search_string = str(search_string).lstrip('*')
|
search_string = utils.to_unicode(search_string).lstrip('*')
|
||||||
dbref = self.dbref(search_string)
|
dbref = self.dbref(search_string)
|
||||||
if not dbref:
|
if not dbref:
|
||||||
# not a dbref. Search by name.
|
# not a dbref. Search by name.
|
||||||
|
|
@ -99,7 +100,7 @@ class ObjectManager(TypedObjectManager):
|
||||||
if exact:
|
if exact:
|
||||||
return [attr.obj for attr in attrs if attribute_value == attr.value]
|
return [attr.obj for attr in attrs if attribute_value == attr.value]
|
||||||
else:
|
else:
|
||||||
return [attr.obj for attr in attrs if str(attribute_value) in str(attr.value)]
|
return [attr.obj for attr in attrs if utils.to_unicode(attribute_value) in str(attr.value)]
|
||||||
|
|
||||||
@returns_typeclass_list
|
@returns_typeclass_list
|
||||||
def get_objs_with_db_property(self, property_name, location=None):
|
def get_objs_with_db_property(self, property_name, location=None):
|
||||||
|
|
@ -144,10 +145,12 @@ class ObjectManager(TypedObjectManager):
|
||||||
lstring_key = ", db_location=location"
|
lstring_key = ", db_location=location"
|
||||||
lstring_alias = ", db_obj__db_location=location"
|
lstring_alias = ", db_obj__db_location=location"
|
||||||
if exact:
|
if exact:
|
||||||
estring = "iexact"
|
estring = "__iexact"
|
||||||
matches = eval("self.filter(db_key__%s=ostring%s)" % (estring, lstring_key))
|
else:
|
||||||
|
estring = "__istartswith"
|
||||||
|
matches = eval("self.filter(db_key%s=ostring%s)" % (estring, lstring_key))
|
||||||
if not matches:
|
if not matches:
|
||||||
alias_matches = eval("self.model.alias_set.related.model.objects.filter(db_key__%s=ostring%s)" % (estring, lstring_alias))
|
alias_matches = eval("self.model.alias_set.related.model.objects.filter(db_key%s=ostring%s)" % (estring, lstring_alias))
|
||||||
matches = [alias.db_obj for alias in alias_matches]
|
matches = [alias.db_obj for alias in alias_matches]
|
||||||
return matches
|
return matches
|
||||||
|
|
||||||
|
|
@ -205,7 +208,7 @@ class ObjectManager(TypedObjectManager):
|
||||||
|
|
||||||
# Test if we are looking for a player object
|
# Test if we are looking for a player object
|
||||||
|
|
||||||
if str(ostring).startswith("*"):
|
if utils.to_unicode(ostring).startswith("*"):
|
||||||
# Player search - try to find obj by its player's name
|
# Player search - try to find obj by its player's name
|
||||||
player_match = self.get_object_with_player(ostring)
|
player_match = self.get_object_with_player(ostring)
|
||||||
if player_match is not None:
|
if player_match is not None:
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ from src.server.models import ServerConfig
|
||||||
from src.commands.cmdsethandler import CmdSetHandler
|
from src.commands.cmdsethandler import CmdSetHandler
|
||||||
from src.scripts.scripthandler import ScriptHandler
|
from src.scripts.scripthandler import ScriptHandler
|
||||||
from src.utils import logger
|
from src.utils import logger
|
||||||
from src.utils.utils import is_iter
|
from src.utils.utils import is_iter, to_unicode
|
||||||
|
|
||||||
FULL_PERSISTENCE = settings.FULL_PERSISTENCE
|
FULL_PERSISTENCE = settings.FULL_PERSISTENCE
|
||||||
|
|
||||||
|
|
@ -151,6 +151,9 @@ class NickHandler(object):
|
||||||
return nick
|
return nick
|
||||||
else:
|
else:
|
||||||
return Nick.objects.filter(db_obj=self.obj)
|
return Nick.objects.filter(db_obj=self.obj)
|
||||||
|
def has(self, nick, nick_type="inputline"):
|
||||||
|
"Returns true/false if this nick is defined or not"
|
||||||
|
return Nick.objects.filter(db_obj=self.obj, db_nick__iexact=nick, db_type__iexact=nick_type).count()
|
||||||
|
|
||||||
#------------------------------------------------------------
|
#------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|
@ -579,6 +582,10 @@ class ObjectDB(TypedObject):
|
||||||
raw_string - raw command input coming from the command line.
|
raw_string - raw command input coming from the command line.
|
||||||
"""
|
"""
|
||||||
# nick replacement - we require full-word matching.
|
# nick replacement - we require full-word matching.
|
||||||
|
|
||||||
|
# do text encoding conversion
|
||||||
|
raw_string = to_unicode(raw_string)
|
||||||
|
|
||||||
raw_list = raw_string.split(None)
|
raw_list = raw_string.split(None)
|
||||||
raw_list = [" ".join(raw_list[:i+1]) for i in range(len(raw_list)) if raw_list[:i+1]]
|
raw_list = [" ".join(raw_list[:i+1]) for i in range(len(raw_list)) if raw_list[:i+1]]
|
||||||
for nick in Nick.objects.filter(db_obj=self, db_type__in=("inputline","channel")):
|
for nick in Nick.objects.filter(db_obj=self, db_type__in=("inputline","channel")):
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,7 @@ class Object(TypeClass):
|
||||||
string = "{c%s{n" % self.name
|
string = "{c%s{n" % self.name
|
||||||
desc = self.attr("desc")
|
desc = self.attr("desc")
|
||||||
if desc:
|
if desc:
|
||||||
string += ":\n %s" % desc
|
string += "\n %s" % desc
|
||||||
exits = []
|
exits = []
|
||||||
users = []
|
users = []
|
||||||
things = []
|
things = []
|
||||||
|
|
|
||||||
|
|
@ -441,7 +441,7 @@ class TypedObject(SharedMemoryModel):
|
||||||
def permissions_set(self, value):
|
def permissions_set(self, value):
|
||||||
"Setter. Allows for self.name = value. Stores as a comma-separated string."
|
"Setter. Allows for self.name = value. Stores as a comma-separated string."
|
||||||
if is_iter(value):
|
if is_iter(value):
|
||||||
value = ",".join([str(val).strip() for val in value])
|
value = ",".join([utils.to_unicode(val).strip() for val in value])
|
||||||
self.db_permissions = value
|
self.db_permissions = value
|
||||||
self.save()
|
self.save()
|
||||||
#@permissions.deleter
|
#@permissions.deleter
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ user.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import re
|
import re
|
||||||
|
from src.utils import utils
|
||||||
|
|
||||||
class ANSITable(object):
|
class ANSITable(object):
|
||||||
"""
|
"""
|
||||||
|
|
@ -140,7 +141,7 @@ class ANSIParser(object):
|
||||||
"""
|
"""
|
||||||
if not string:
|
if not string:
|
||||||
return ''
|
return ''
|
||||||
string = str(string)
|
string = utils.to_str(string)
|
||||||
for sub in self.ansi_sub:
|
for sub in self.ansi_sub:
|
||||||
# go through all available mappings and translate them
|
# go through all available mappings and translate them
|
||||||
string = sub[0].sub(sub[1], string)
|
string = sub[0].sub(sub[1], string)
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ Models covered:
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from src.utils import logger
|
from src.utils import logger, utils
|
||||||
from src.utils.utils import is_iter, has_parent
|
from src.utils.utils import is_iter, has_parent
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
@ -62,7 +62,7 @@ def create_object(typeclass, key=None, location=None,
|
||||||
# the type mechanism will automatically assign
|
# the type mechanism will automatically assign
|
||||||
# the BASE_OBJECT_TYPE from settings.
|
# the BASE_OBJECT_TYPE from settings.
|
||||||
if typeclass:
|
if typeclass:
|
||||||
typeclass = str(typeclass)
|
typeclass = utils.to_unicode(typeclass)
|
||||||
new_db_object.typeclass_path = typeclass
|
new_db_object.typeclass_path = typeclass
|
||||||
new_db_object.save()
|
new_db_object.save()
|
||||||
# this will either load the typeclass or the default one
|
# this will either load the typeclass or the default one
|
||||||
|
|
@ -100,9 +100,7 @@ def create_object(typeclass, key=None, location=None,
|
||||||
if permissions:
|
if permissions:
|
||||||
new_object.permissions = permissions
|
new_object.permissions = permissions
|
||||||
if aliases:
|
if aliases:
|
||||||
if not is_iter(aliases):
|
new_object.aliases = aliases
|
||||||
aliases = [aliases]
|
|
||||||
new_object.aliases = ",".join([alias.strip() for alias in aliases])
|
|
||||||
if locks:
|
if locks:
|
||||||
new_object.locks.add(locks)
|
new_object.locks.add(locks)
|
||||||
|
|
||||||
|
|
@ -160,7 +158,7 @@ def create_script(typeclass, key=None, obj=None, locks=None, autostart=True):
|
||||||
if not callable(typeclass):
|
if not callable(typeclass):
|
||||||
# try to load this in case it's a path
|
# try to load this in case it's a path
|
||||||
if typeclass:
|
if typeclass:
|
||||||
typeclass = str(typeclass)
|
typeclass = utils.to_unicode(typeclass)
|
||||||
new_db_object.typeclass_path = typeclass
|
new_db_object.typeclass_path = typeclass
|
||||||
new_db_object.save()
|
new_db_object.save()
|
||||||
# this will load either the typeclass or the default one
|
# this will load either the typeclass or the default one
|
||||||
|
|
@ -321,7 +319,7 @@ def create_channel(key, aliases=None, desc=None,
|
||||||
if aliases:
|
if aliases:
|
||||||
if not is_iter(aliases):
|
if not is_iter(aliases):
|
||||||
aliases = [aliases]
|
aliases = [aliases]
|
||||||
new_channel.aliases = ",".join([str(alias) for alias in aliases])
|
new_channel.aliases = ",".join([alias for alias in aliases])
|
||||||
new_channel.desc = desc
|
new_channel.desc = desc
|
||||||
new_channel.keep_log = keep_log
|
new_channel.keep_log = keep_log
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue