From 54278171124b845cae0c459ccb87f0da21a28050 Mon Sep 17 00:00:00 2001 From: Chiizujin Date: Mon, 1 Apr 2024 18:20:10 +1100 Subject: [PATCH] Add alias/delete switch --- evennia/commands/default/building.py | 28 +++++++++++++++++++++++----- evennia/commands/default/tests.py | 17 +++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/evennia/commands/default/building.py b/evennia/commands/default/building.py index c503990345..e99455d0f9 100644 --- a/evennia/commands/default/building.py +++ b/evennia/commands/default/building.py @@ -218,10 +218,13 @@ class CmdSetObjAlias(COMMAND_DEFAULT_CLASS): alias [= [alias[,alias,alias,...]]] alias = alias/category = [alias[,alias,...]: + alias/delete = Switches: category - requires ending input with :category, to store the given aliases with the given category. + delete - deletes all occurrences of the given alias, regardless + of category Assigns aliases to an object so it can be referenced by more than one name. Assign empty to remove all aliases from object. If @@ -235,7 +238,7 @@ class CmdSetObjAlias(COMMAND_DEFAULT_CLASS): key = "@alias" aliases = "setobjalias" - switch_options = ("category",) + switch_options = ("category", "delete") locks = "cmd:perm(setobjalias) or perm(Builder)" help_category = "Building" @@ -252,12 +255,12 @@ class CmdSetObjAlias(COMMAND_DEFAULT_CLASS): return objname = self.lhs - # Find the object to receive aliases + # Find the object to receive/delete aliases obj = caller.search(objname) if not obj: return - if self.rhs is None: - # no =, so we just list aliases on object. + if self.rhs is None and 'delete' not in self.switches: + # no =, and not deleting, so we just list aliases on object. aliases = obj.aliases.all(return_key_and_category=True) if aliases: caller.msg( @@ -280,7 +283,9 @@ class CmdSetObjAlias(COMMAND_DEFAULT_CLASS): return if not self.rhs: - # we have given an empty =, so delete aliases + # we have given an empty =, so delete aliases. + # as a side-effect, 'alias/delete obj' and 'alias/delete obj=' + # will also be caught here, which is fine old_aliases = obj.aliases.all() if old_aliases: caller.msg( @@ -292,6 +297,19 @@ class CmdSetObjAlias(COMMAND_DEFAULT_CLASS): caller.msg("No aliases to clear.") return + if "delete" in self.switches: + # delete all matching keys, regardless of category + existed = False + for key, category in obj.aliases.all(return_key_and_category=True): + if key == self.rhs: + obj.aliases.remove(key=self.rhs, category=category) + existed = True + if existed: + caller.msg("Alias '%s' deleted from %s." % (self.rhs, obj.get_display_name(caller))) + else: + caller.msg("%s has no alias '%s'." % (obj.get_display_name(caller), self.rhs)) + return + category = None if "category" in self.switches: if ":" in self.rhs: diff --git a/evennia/commands/default/tests.py b/evennia/commands/default/tests.py index 3a272e04f7..bf52a8be81 100644 --- a/evennia/commands/default/tests.py +++ b/evennia/commands/default/tests.py @@ -790,6 +790,23 @@ class TestBuilding(BaseEvenniaCommandTest): self.call(building.CmdSetObjAlias(), "Obj2 =", "Cleared aliases from Obj2") self.call(building.CmdSetObjAlias(), "Obj2 =", "No aliases to clear.") + self.call(building.CmdSetObjAlias(), "Obj =", "Cleared aliases from Obj: testobj1b") + self.call(building.CmdSetObjAlias(), + "/category Obj = testobj1b:category1", + "Alias(es) for 'Obj' set to 'testobj1b' (category: 'category1')." + ) + self.call( + building.CmdSetObjAlias(), + "/category Obj = testobj1b:category2", + "Alias(es) for 'Obj' set to 'testobj1b,testobj1b' (category: 'category2')." + ) + self.call( + building.CmdSetObjAlias(), # delete both occurences of alias 'testobj1b' + "/delete Obj = testobj1b", + "Alias 'testobj1b' deleted from Obj." + ) + self.call(building.CmdSetObjAlias(), "Obj =", "No aliases to clear.") + def test_copy(self): self.call( building.CmdCopy(),