Added /me and fixed some bugs in Commands

This commit is contained in:
Cooldude2606
2019-03-02 21:08:22 +00:00
parent 89bd964498
commit f1ecaff4a5
5 changed files with 23 additions and 20 deletions

View File

@@ -63,7 +63,7 @@
:add_defaults{smiley=false} -- adds false as the default for smiley
:add_tag('admin_only',true) -- adds the tag admin_only: true which because of the above authenticator means you must be added to use this command
:add_alias('name','rname') -- adds two aliases "name" and "rname" for this command which will work as if the ordinal name was used
--:auto_concat() -- cant be used due to optional param here, but this will make all user input params after the last expected one be added to the last expected one
--:enable_auto_concat() -- cant be used due to optional param here, but this will make all user input params after the last expected one be added to the last expected one
:register(function(player,repeat_count,smiley,raw) -- this registers the command to the game, notice the params are what were defined above
-- prints the raw input to show that it can be used
game.print(player.name..' used a command with input: '..raw)
@@ -150,7 +150,7 @@
Commands._prototype:add_defaults(defaults) --- Adds default values to params only matters if the param is optional
Commands._prototype:add_tag(name,value) --- Adds a tag to the command which is passed via the tags param to the authenticators, can be used to assign command roles or type
Commands._prototype:add_alias(...) --- Adds an alias or multiple that will also be registered with the same callback, eg /teleport can be /tp with both working
Commands._prototype:auto_concat() --- Enables auto concatenation of any params on the end so quotes are not needed for last param
Commands._prototype:enable_auto_concat() --- Enables auto concatenation of any params on the end so quotes are not needed for last param
Commands._prototype:register(callback) --- Adds the callback to the command and registers all aliases, params and help message with the game
Commands.error(error_message,play_sound) --- Sends an error message to the player and returns a constant to return to command handler to exit execution
@@ -173,7 +173,7 @@ local Commands = {
commands={}, -- custom command data will be stored here
authorization_fail_on_error=false, -- set true to have authorize fail if a callback fails to run, more secure
authorization={}, -- custom function are stored here which control who can use what commands
parse={}, -- used to store default functions which are common parse function such as player or number in range
parse_functions={}, -- used to store default functions which are common parse function such as player or number in range
print=player_return, -- short cut so player_return does not need to be required in every module
_prototype={}, -- used to store functions which gets added to new custom commands
}
@@ -187,7 +187,8 @@ local Commands = {
-- callback param - reject: function(error_message?: string) - call to fail authorize with optional error message
-- @treturn number the index it was inserted at use to remove the callback, if anon function used
function Commands.add_authenticator(callback)
return table.insert(Commands.authorization,callback)
table.insert(Commands.authorization,callback)
return #Commands.authorization
end
--- Removes an authorization callback
@@ -320,10 +321,10 @@ end
-- parse return - the value that will be passed to the command callback, must not be nil and if reject then command is not run
-- @treturn boolean was the parse added will be false if the name is already used
function Commands.add_parse(name,callback)
if Commands.parse[name] then
if Commands.parse_functions[name] then
return false
else
Commands.parse[name] = callback
Commands.parse_functions[name] = callback
return true
end
end
@@ -331,7 +332,7 @@ end
--- Removes a parse function, see add_parse for adding them
-- @tparam name string the name of the parse to remove
function Commands.remove_parse(name)
Commands.parse[name] = nil
Commands.parse_functions[name] = nil
end
--- Intended to be used within other parse functions, runs a parse and returns success and new value
@@ -339,8 +340,8 @@ end
-- @tparam input string the input to pass to the parse, will always be a string but might not be the orginal input
-- @treturn any the new value for the input, may be nil, if nil then either there was an error or input was nil
function Commands.parse(name,input,player,reject,...)
if not Commands.parse[name] then return end
local success,rtn = pcall(Commands.parse[name],input,player,reject,...)
if not Commands.parse_functions[name] then return end
local success,rtn = pcall(Commands.parse_functions[name],input,player,reject,...)
if not success then error(rtn,2) return end
if not rtn then return end
if rtn == Commands.defines.error then return end
@@ -439,7 +440,7 @@ end
-- nb: this will disable max param checking as they will be concated onto the end of that last param
-- this can be useful for reasons or longs text, can only have one per command
-- @treturn Commands._prototype pass through to allow more functions to be called
function Commands._prototype:auto_concat()
function Commands._prototype:enable_auto_concat()
self.auto_concat = true
return self
end
@@ -544,12 +545,12 @@ function Commands.run_command(command_event)
local quote_params = {} -- stores any " " params
input_string = input_string:gsub('"[^"]-"',function(w)
-- finds all " " params are removes spaces for the next part
local no_spaces = w:gsub('%s','_')
local no_quotes = w:sub(2,-2)
local no_spaces = no_quotes:gsub('%s','_')
quote_params[no_spaces]=no_quotes
if command_data.auto_concat then
-- if auto concat then dont remove quotes as it should be included later
quote_params[w:gsub('%s','_')]=w
quote_params[no_spaces]=w
end
return no_spaces
end)
@@ -579,9 +580,11 @@ function Commands.run_command(command_event)
-- all words are added to an array
if quote_params[word] then
-- if it was a " " param then the spaces are re added now
last_index = table.insert(raw_params,quote_params[word])
table.insert(raw_params,quote_params[word])
last_index = last_index + 1
else
last_index = table.insert(raw_params,word)
table.insert(raw_params,word)
last_index = last_index + 1
end
end
end
@@ -600,7 +603,7 @@ function Commands.run_command(command_event)
local parse_callback = param_data.parse
if type(parse_callback) == 'string' then
-- if its a string this allows it to be pulled from the common store
parse_callback = Commands.parse[parse_callback]
parse_callback = Commands.parse_functions[parse_callback]
end
if not type(parse_callback) == 'function' then
-- if its not a function throw and error
@@ -642,5 +645,4 @@ function Commands.run_command(command_event)
if err ~= Commands.defines.error and err ~= Commands.defines.success then Commands.success(err) end
end
require 'expcore.parse.command' -- loads some common parse types
return Commands