I have a function that I made for some admin I'm working on that will scan text to look for the Prefix character, which signals the beginning of a new command, and separates all the command sections from each other. This is supposed to allow the user to have multiple commands in one line.
For example:
:kill me :m I am dead!
Would run the kill command first, and then the message command, while still being on the same command line.
Also, I needed my function to check if the word after was a command name, so that you could put the prefix character in colons. This is the main reason why I just didn't use string.gmatch
For example:
:m Rules: There are none!
The everything after "Rules:" would be cut off if I simply used string.gmatch
because of the colon in the message.
My function works well but it's horribly expensive to run through, so I was wondering if there is a better way to do it. If you need anything to be explained, let me know (It is a bit complex to read!)
My function:
local returnCommandSections = function(text) -- Separates multiple commands and their arguments after each prefix (Ex: :kill me :m Ded :m Placing at xx:40) local sections = {} local textBrokenDown = {} -- Array of all the characters in the text for x in string.gmatch(text, ".") do -- Separates all the characters into separate strings, then inserts them in the textBrokenDown array table.insert(textBrokenDown, x) end for i, v in next, textBrokenDown do -- Main loop that goes through each character in textBrokenDown if v == _settings.Prefix then local startPrefixIndex = i local newSection = {} for v = i, #textBrokenDown do if textBrokenDown[v] ~= _settings.Prefix then -- If statement that checks whether or not the prefix character goes in the section or starts a new section table.insert(newSection, textBrokenDown[v]) elseif textBrokenDown[v] == _settings.Prefix and v ~= startPrefixIndex then local everythingAfter = table.concat(textBrokenDown, "", v) local command = returnArgs (everythingAfter:sub(2)) -- This function just checks if the word after is a command if command and command.Name ~= nil then break else table.insert(newSection, everythingAfter) table.insert(sections, table.concat(newSection)) return sections end end end table.insert(sections, table.concat(newSection)) end end return sections end