From 02ba40124ef6067f29c688f13bbf61de33a1c44e Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 28 Feb 2022 08:09:03 +1100 Subject: [PATCH] feat(commands): chat suggestions --- imports/commands/server.lua | 101 ++++++++++++++++++++++++++++-------- 1 file changed, 80 insertions(+), 21 deletions(-) diff --git a/imports/commands/server.lua b/imports/commands/server.lua index ca0ffe5..9bfda7c 100644 --- a/imports/commands/server.lua +++ b/imports/commands/server.lua @@ -1,48 +1,107 @@ +local commands = {} + +SetTimeout(1000, function() + TriggerClientEvent('chat:addSuggestions', -1, commands) +end) + +AddEventHandler('playerJoining', function(source) + TriggerClientEvent('chat:addSuggestions', source, commands) +end) + +local function chatSuggestion(name, parameters, help) + local params = {} + + if parameters then + for i = 1, #parameters do + local arg, argType = string.strsplit(':', parameters[i]) + + if argType and argType:sub(0, 1) == '?' then + argType = argType:sub(2, #argType) + end + + params[i] = { + name = arg, + help = argType + } + end + end + + commands[#commands + 1] = { + name = '/'..name, + help = help, + params = params + } +end + ---@param group string ---@param name string ---@param callback function ----@param arguments string -local function AddCommand(group, name, callback, arguments) +---@param parameters table +local function addCommand(group, name, callback, parameters, help) + if not group then group = 'builtin.everyone' end + if type(name) == 'table' then - for i=1, #name do - AddCommand(group, name[i], callback, arguments) + for i = 1, #name do + addCommand(group, name[i], callback, parameters, help) end else - if not group then group = 'builtin.everyone' end + chatSuggestion(name, parameters, help) RegisterCommand(name, function(source, args) - if arguments then - for i=1, #arguments do - local arg, argType = string.strsplit(':', arguments[i]) + source = tonumber(source) + + if parameters then + for i = 1, #parameters do + local arg, argType = string.strsplit(':', parameters[i]) local value = args[i] if arg == 'target' and value == 'me' then value = source end if argType then - if argType == 'number' then value = tonumber(value) end - assert(type(value) == argType or argType:find('?'), ('%s expected <%s> for argument %s (%s), received %s'):format(name, argType, i, arg, type(value))) + local optional + + if argType:sub(0, 1) == '?' then + argType = argType:sub(2, #argType) + optional = true + end + + if argType == 'number' then + value = tonumber(value) or value + end + + local type = type(value) + + if type ~= argType and (not optional or type ~= 'nil') then + local invalid = ('^1%s expected <%s> for argument %s (%s), received %s^0'):format(name, argType, i, arg, type) + if source < 1 then + return print(invalid) + else + return TriggerClientEvent('chat:addMessage', source, invalid) + end + end end args[arg] = value args[i] = nil end end - callback(tonumber(source), args) + + callback(source, args) end, group and true) name = ('command.%s'):format(name) - if not IsPrincipalAceAllowed(group, name) then ExecuteCommand(('add_ace %s %s allow'):format(group, name)) end + if not IsPrincipalAceAllowed(group, name) then lib.addAce(group, name) end end end -return AddCommand +return addCommand --[[ Example - AddCommand('admin', {'additem', 'giveitem'}, function(source, args) - args.item = Items(args.item) - if args.item and args.count > 0 then - Inventory.AddItem(args.target, args.item.name, args.count, args.metatype) - end - end, {'target:number', 'item:string', 'count:number', 'metatype:?string'}) - -- /additem 1 burger 1 -]] \ No newline at end of file + AddCommand('group.admin', {'additem', 'giveitem'}, function(source, args) + args.item = Items(args.item) + if args.item and args.count > 0 then + Inventory.AddItem(args.target, args.item.name, args.count, args.metatype) + end + end, {'target:number', 'item:string', 'count:number', 'metatype:?string'}) + -- /additem 1 burger 1 +]]