From 7ff97599be75605fc7a2ddcd4643324d3a9a367a Mon Sep 17 00:00:00 2001 From: Greg Taylor Date: Sun, 25 Jan 2009 03:11:52 +0000 Subject: [PATCH] Move standard_objsearch to Objects.search_for_object. Also make sure @alias only accepts alphanumeric strings. --- src/commands/general.py | 24 ++++---- src/commands/objmanip.py | 80 +++++++++++++------------- src/commands/privileged.py | 4 +- src/commands/search.py | 8 +-- src/helpsys/fixtures/initial_data.json | 2 +- src/objects/managers/object.py | 28 --------- src/objects/models.py | 37 ++++++++++++ 7 files changed, 93 insertions(+), 90 deletions(-) diff --git a/src/commands/general.py b/src/commands/general.py index 9f638663e9..bd053f5740 100644 --- a/src/commands/general.py +++ b/src/commands/general.py @@ -121,9 +121,8 @@ def cmd_look(command): # If an argument is provided with the command, search for the object. # else look at the current room. if command.command_argument: - target_obj = Object.objects.standard_objsearch(source_object, - command.command_argument) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(command.command_argument) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return else: @@ -151,10 +150,9 @@ def cmd_get(command): source_object.emit_to("Get what?") return else: - target_obj = Object.objects.standard_objsearch(source_object, - command.command_argument, - search_contents=False) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(command.command_argument, + search_contents=False) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -193,10 +191,9 @@ def cmd_drop(command): source_object.emit_to("Drop what?") return else: - target_obj = Object.objects.standard_objsearch(source_object, - command.command_argument, - search_location=False) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(command.command_argument, + search_location=False) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -248,9 +245,8 @@ def cmd_examine(command): obj_searchstr = command.command_argument # Resolve the target object. - target_obj = Object.objects.standard_objsearch(source_object, - obj_searchstr) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(obj_searchstr) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return diff --git a/src/commands/objmanip.py b/src/commands/objmanip.py index 2a150cdedd..41aa77c2a5 100644 --- a/src/commands/objmanip.py +++ b/src/commands/objmanip.py @@ -29,13 +29,13 @@ def cmd_teleport(command): # a direct teleport, @tel . if len(eq_args) > 1: # Equal sign teleport. - victim = Object.objects.standard_objsearch(source_object, eq_args[0]) - # Use standard_objsearch to handle duplicate/nonexistant results. + victim = source_object.search_for_object(eq_args[0]) + # Use search_for_object to handle duplicate/nonexistant results. if not victim: return - destination = Object.objects.standard_objsearch(source_object, eq_args[1]) - # Use standard_objsearch to handle duplicate/nonexistant results. + destination = source_object.search_for_object(eq_args[1]) + # Use search_for_object to handle duplicate/nonexistant results. if not destination: return @@ -50,9 +50,8 @@ def cmd_teleport(command): victim.move_to(destination, quiet=tel_quietly) else: # Direct teleport (no equal sign) - target_obj = Object.objects.standard_objsearch(source_object, - command.command_argument) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(command.command_argument) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -83,11 +82,15 @@ def cmd_alias(command): new_alias = eq_args[1] # An Object instance for the victim. - target = Object.objects.standard_objsearch(source_object, target_string) - # Use standard_objsearch to handle duplicate/nonexistant results. + target = source_object.search_for_object(target_string) + # Use search_for_object to handle duplicate/nonexistant results. if not target: source_object.emit_to("I can't find that player.") return + + if not new_alias.isalnum(): + source_object.emit_to("Aliases must be alphanumeric.") + return old_alias = target.get_attribute_value('ALIAS') duplicates = Object.objects.player_alias_search(source_object, new_alias) @@ -130,8 +133,8 @@ def cmd_wipe(command): else: searchstr = command.command_argument - target_obj = Object.objects.standard_objsearch(source_object, attr_split[0]) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(attr_split[0]) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -173,8 +176,8 @@ def cmd_set(command): source_object.emit_to("Set what?") return - victim = Object.objects.standard_objsearch(source_object, eq_args[0]) - # Use standard_objsearch to handle duplicate/nonexistant results. + victim = source_object.search_for_object(eq_args[0]) + # Use search_for_object to handle duplicate/nonexistant results. if not victim: return @@ -297,7 +300,7 @@ def cmd_cpattr(command): source_attr_string = source[1].strip().upper() # Check whether src_obj exists - src_obj = Object.objects.standard_objsearch(source_object, source_string) + src_obj = source_object.search_for_object(source_string) if not src_obj: source_object.emit_to("Source object does not exist.") @@ -319,7 +322,7 @@ def cmd_cpattr(command): tar_string = tar[0].strip() tar_attr_string = tar[1].strip().upper() - tar_obj = Object.objects.standard_objsearch(source_object, tar_string) + tar_obj = source_object.search_for_object(tar_string) # Does target exist? if not tar_obj: @@ -372,9 +375,8 @@ def cmd_open(command): if len(eq_args) > 1: # Opening an exit to another location via @open =[,]. comma_split = eq_args[1].split(',', 1) - destination = Object.objects.standard_objsearch(source_object, - comma_split[0]) - # Use standard_objsearch to handle duplicate/nonexistant results. + destination = source_object.search_for_object(comma_split[0]) + # Use search_for_object to handle duplicate/nonexistant results. if not destination: return @@ -438,8 +440,8 @@ def cmd_chown(command): return if len(eq_args) > 1: - target_obj = Object.objects.standard_objsearch(source_object, target_name) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(target_name) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -447,8 +449,8 @@ def cmd_chown(command): source_object.emit_to(defines_global.NOCONTROL_MSG) return - owner_obj = Object.objects.standard_objsearch(source_object, owner_name) - # Use standard_objsearch to handle duplicate/nonexistant results. + owner_obj = source_object.search_for_object(owner_name) + # Use search_for_object to handle duplicate/nonexistant results. if not owner_obj: return if not owner_obj.is_player(): @@ -488,8 +490,8 @@ def cmd_chzone(command): return if len(eq_args) > 1: - target_obj = Object.objects.standard_objsearch(source_object, target_name) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(target_name) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -503,8 +505,8 @@ def cmd_chzone(command): source_object.emit_to("%s is no longer zoned." % (target_obj)) return - zone_obj = Object.objects.standard_objsearch(source_object, zone_name) - # Use standard_objsearch to handle duplicate/nonexistant results. + zone_obj = source_object.search_for_object(zone_name) + # Use search_for_object to handle duplicate/nonexistant results. if not zone_obj: return @@ -538,8 +540,8 @@ def cmd_link(command): return if len(eq_args) > 1: - target_obj = Object.objects.standard_objsearch(source_object, target_name) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(target_name) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -553,8 +555,8 @@ def cmd_link(command): source_object.emit_to("You have unlinked %s." % (target_obj,)) return - destination = Object.objects.standard_objsearch(source_object, dest_name) - # Use standard_objsearch to handle duplicate/nonexistant results. + destination = source_object.search_for_object(dest_name) + # Use search_for_object to handle duplicate/nonexistant results. if not destination: return @@ -578,9 +580,8 @@ def cmd_unlink(command): source_object.emit_to("Unlink what?") return else: - target_obj = Object.objects.standard_objsearch(source_object, - command.command_argument) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(command.command_argument) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -637,8 +638,8 @@ def cmd_name(command): if len(eq_args) < 2 or eq_args[1] == '': source_object.emit_to("What would you like to name that object?") else: - target_obj = Object.objects.standard_objsearch(source_object, eq_args[0]) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(eq_args[0]) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -663,8 +664,8 @@ def cmd_description(command): source_object.emit_to("How would you like to describe that object?") return - target_obj = Object.objects.standard_objsearch(source_object, eq_args[0]) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(eq_args[0]) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return @@ -695,9 +696,8 @@ def cmd_destroy(command): if "override" in command.command_switches: switch_override = True - target_obj = Object.objects.standard_objsearch(source_object, - command.command_argument) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(command.command_argument) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return diff --git a/src/commands/privileged.py b/src/commands/privileged.py index 09841855c1..4b6165ac03 100644 --- a/src/commands/privileged.py +++ b/src/commands/privileged.py @@ -101,8 +101,8 @@ def cmd_newpassword(command): source_object.emit_to("You must supply a new password.") return - target_obj = Object.objects.standard_objsearch(source_object, searchstring) - # Use standard_objsearch to handle duplicate/nonexistant results. + target_obj = source_object.search_for_object(searchstring) + # Use search_for_object to handle duplicate/nonexistant results. if not target_obj: return diff --git a/src/commands/search.py b/src/commands/search.py index e6dc50dc61..db9a470b0c 100644 --- a/src/commands/search.py +++ b/src/commands/search.py @@ -84,8 +84,7 @@ def build_query(source_object, search_query, search_player, search_type, # Look up an Object matching the player search query if search_player: # Replace the string variable with an Object reference - search_player = Object.objects.standard_objsearch(source_object, - search_player) + search_player = source_object.search_for_object(search_player) # Use standard_objsearch to handle duplicate/nonexistant results if not search_player: return None @@ -121,9 +120,8 @@ def build_query(source_object, search_query, search_player, search_type, search_query = search_query.filter(name__icontains=search_restriction, type=defines_global.OTYPE_PLAYER) elif search_type == "zone": - zone_obj = Object.objects.standard_objsearch(source_object, - search_restriction) - # Use standard_objsearch to handle duplicate/nonexistant results. + zone_obj = source_object.search_for_object(search_restriction) + # Use search_for_object to handle duplicate/nonexistant results. if not zone_obj: return None search_query = search_query.filter(zone=zone_obj) diff --git a/src/helpsys/fixtures/initial_data.json b/src/helpsys/fixtures/initial_data.json index a80cf7834a..9699c07330 100644 --- a/src/helpsys/fixtures/initial_data.json +++ b/src/helpsys/fixtures/initial_data.json @@ -1 +1 @@ -[{"pk": 1, "model": "helpsys.helpentry", "fields": {"entrytext": "This is to prevent a weird encoding error with SQLite3.", "topicname": "Z19kD", "staff_only": false}}] +[{"pk": 1, "model": "helpsys.helpentry", "fields": {"entrytext": " This is the TinyMUX online help facility.\r\n\r\n Notes on help descriptions:\r\n [text] - Text enclosed in []'s is optional. The []'s are never typed\r\n in as part of the command.\r\n - Information parameter for a command. The <>'s are\r\n never typed in as part of the command.\r\n\r\n - Syntax of help command:\r\n help []\r\n\r\n - To get a list of TinyMUX topics:\r\n help topics\r\n\r\n - To get a list of Comsystem commands:\r\n help comsys\r\n\r\n - To get a list of TinyMUX Commands:\r\n help commands (or @list commands)\r\n\r\n Some of the configuration shown in the help.txt might not be the same as\r\n the configuration of this MUX. If you notice any errors, contact an admin.\r\n", "topicname": "Help Index", "staff_only": false}}] diff --git a/src/objects/managers/object.py b/src/objects/managers/object.py index f65f18e7e9..a188cb4aa8 100644 --- a/src/objects/managers/object.py +++ b/src/objects/managers/object.py @@ -99,34 +99,6 @@ class ObjectManager(models.Manager): else: return [prospect for prospect in searchlist if prospect.name_match(ostring, match_type=match_type)] - - def standard_objsearch(self, source_object, ostring, search_contents=True, - search_location=True, dbref_only=False, - limit_types=False): - """ - Perform a standard object search, handling multiple - results and lack thereof gracefully. - - source_object: (Object) The Object doing the searching - ostring: (str) The string to match object names against. - """ - results = self.local_and_global_search(source_object, ostring, - search_contents=search_contents, - search_location=search_location, - dbref_only=dbref_only, - limit_types=limit_types) - - if len(results) > 1: - source_object.emit_to("More than one match found (please narrow target):") - for result in results: - source_object.emit_to(" %s" % (result.get_name(),)) - return False - elif len(results) == 0: - source_object.emit_to("I don't see that here.") - return False - else: - return results[0] - def object_totals(self): """ Returns a dictionary with database object totals. diff --git a/src/objects/models.py b/src/objects/models.py index f0d499a231..b47d1acabd 100755 --- a/src/objects/models.py +++ b/src/objects/models.py @@ -136,6 +136,43 @@ class Object(models.Model): """ BEGIN COMMON METHODS """ + def search_for_object(self, ostring, emit_to_obj=None, search_contents=True, + search_location=True, dbref_only=False, + limit_types=False, search_aliases=False): + """ + Perform a standard object search, handling multiple + results and lack thereof gracefully. + + source_object: (Object) The Object doing the searching + ostring: (str) The string to match object names against. + """ + # This is the object that gets the duplicate/no match emits. + if not emit_to_obj: + emit_to_obj = self + + if search_aliases: + # If an alias match is found, get out of here and skip the rest. + alias_results = Object.objects.player_alias_search(self, ostring) + if alias_results: + return alias_results[0] + + results = Object.objects.local_and_global_search(self, ostring, + search_contents=search_contents, + search_location=search_location, + dbref_only=dbref_only, + limit_types=limit_types) + + if len(results) > 1: + emit_to_obj.emit_to("More than one match found (please narrow target):") + for result in results: + emit_to_obj.emit_to(" %s" % (result.get_name(),)) + return False + elif len(results) == 0: + emit_to_obj.emit_to("I don't see that here.") + return False + else: + return results[0] + def get_sessions(self): """ Returns a list of sessions matching this object.