Change settings.COMMAND_ARG_REGEX default to require a space or '/' between cmdname and argument. This better matches common expectations. Resolves #1541.

This commit is contained in:
Griatch 2021-10-31 23:08:33 +01:00
parent 36e985557f
commit c2a3c789d3
6 changed files with 35 additions and 12 deletions

View file

@ -103,6 +103,8 @@ Up requirements to Django 3.2+, Twisted 21+
`SERVER_HOSTNAME` setting for use in the server:port stanza.
- Changed all `at_before/after_*` hooks to `at_pre/post_*` for consistency
across Evennia (the old names still work but are deprecated)
- Change `settings.COMMAND_DEFAULT_ARG_REGEX` default from `None` to a regex meaning that
a space or `/` must separate the cmdname and args. This better fits common expectations.
### Evennia 0.9.5 (2019-2020)

View file

@ -216,13 +216,18 @@ class CmdBan(COMMAND_DEFAULT_CLASS):
ipregex = ipregex.replace("*", "[0-9]{1,3}")
ipregex = re.compile(r"%s" % ipregex)
bantup = ("", ban, ipregex, now, reason)
ret = yield(f"Are you sure you want to {typ}-ban '|w{ban}|n' [Y]/N?")
if str(ret).lower() in ("no", "n"):
self.caller.msg("Aborted.")
return
# save updated banlist
banlist.append(bantup)
ServerConfig.objects.conf("server_bans", banlist)
self.caller.msg("%s-Ban |w%s|n was added." % (typ, ban))
self.caller.msg(f"{typ}-ban '|w{ban}|n' was added. Use |wunban|n to reinstate.")
logger.log_sec(
"Banned %s: %s (Caller: %s, IP: %s)."
% (typ, ban.strip(), self.caller, self.session.address)
"Banned {typ}: {ban.strip()} (Caller: {self.caller}, IP: {self.session.address})."
)
@ -264,15 +269,20 @@ class CmdUnban(COMMAND_DEFAULT_CLASS):
elif not (0 < num < len(banlist) + 1):
self.caller.msg("Ban id |w%s|x was not found." % self.args)
else:
# all is ok, clear ban
# all is ok, ask, then clear ban
ban = banlist[num - 1]
value = " ".join([s for s in ban[:2]])
ret = yield(f"Are you sure you want to unban {num}: '{value}' [Y]/N?")
if str(ret).lower() in ("n", "no"):
self.caller.msg("Aborted.")
return
del banlist[num - 1]
ServerConfig.objects.conf("server_bans", banlist)
value = " ".join([s for s in ban[:2]])
self.caller.msg("Cleared ban %s: %s" % (num, value))
self.caller.msg(f"Cleared ban {num}: '{value}'" % (num, value))
logger.log_sec(
"Unbanned: %s (Caller: %s, IP: %s)."
% (value.strip(), self.caller, self.session.address)
"Unbanned: {value.strip()} (Caller: {self.caller}, IP: {self.session.address})."
)

View file

@ -586,6 +586,9 @@ class CmdSay(COMMAND_DEFAULT_CLASS):
aliases = ['"', "'"]
locks = "cmd:all()"
# don't require a space after `say/'/"`
arg_regex = None
def func(self):
"""Run the say command"""
@ -671,6 +674,10 @@ class CmdPose(COMMAND_DEFAULT_CLASS):
aliases = [":", "emote"]
locks = "cmd:all()"
# we want to be able to pose without whitespace between
# the command/alias and the pose (e.g. :pose)
arg_regex = None
def parse(self):
"""
Custom parse the cases where the emote

View file

@ -761,7 +761,7 @@ class TestAdmin(CommandTest):
self.call(admin.CmdWall(), "Test", "Announcing to all connected sessions ...")
def test_ban(self):
self.call(admin.CmdBan(), "Char", "Name-Ban char was added.")
self.call(admin.CmdBan(), "Char", "Name-ban 'char' was added. Use unban to reinstate.")
def test_force(self):
cid = self.char2.id

View file

@ -1092,18 +1092,22 @@ class AccessableCommand(Command):
class _CmdTest1(AccessableCommand):
key = "test1"
arg_regex = None
class _CmdTest2(AccessableCommand):
key = "another command"
arg_regex = None
class _CmdTest3(AccessableCommand):
key = "&the third command"
arg_regex = None
class _CmdTest4(AccessableCommand):
key = "test2"
arg_regex = None
class _CmdSetTest(CmdSet):

View file

@ -476,9 +476,9 @@ CMDSET_FALLBACKS = {
COMMAND_DEFAULT_CLASS = "evennia.commands.default.muxcommand.MuxCommand"
# Command.arg_regex is a regular expression desribing how the arguments
# to the command must be structured for the command to match a given user
# input. By default there is no restriction as long as the input string
# starts with the command name.
COMMAND_DEFAULT_ARG_REGEX = None
# input. By default the command-name should end with a space or / (since the
# default commands uses MuxCommand and /switches).
COMMAND_DEFAULT_ARG_REGEX = r'^[ /]+.*$|$'
# By default, Command.msg will only send data to the Session calling
# the Command in the first place. If set, Command.msg will instead return
# data to all Sessions connected to the Account/Character associated with