From e25c31b3c43e79287eedcfc7f7f303d8a7d534ca Mon Sep 17 00:00:00 2001 From: Durel Date: Tue, 10 Oct 2017 08:24:23 -0400 Subject: [PATCH] Improved priority format checking and error handling --- aard_inventory.xml | 54 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/aard_inventory.xml b/aard_inventory.xml index 08871f4..bebd882 100644 --- a/aard_inventory.xml +++ b/aard_inventory.xml @@ -10562,13 +10562,14 @@ The first column lists the names of each available priority field. Subsequent c if (priorityString == nil) then dbot.info("Cancelled request to edit priority \"@C" .. priorityName .. "@W\"") + retval = DRL_RET_SUCCESS break else priorityEntry, retval = inv.priority.stringToTable(priorityString) if (retval ~= DRL_RET_SUCCESS) then - dbot.warn("inv.priority.edit: Failed to convert priority string into priority: " .. - dbot.retval.getString(retval)) + dbot.debug("inv.priority.edit: Failed to convert priority string into priority: " .. + dbot.retval.getString(retval)) else inv.priority.table[priorityName] = priorityEntry if (not isQuiet) then @@ -10911,47 +10912,46 @@ function inv.priority.stringToTable(priorityString) numColumns = #words elseif (numColumns ~= #words) then - dbot.warn("inv.priority.stringToTable: Malformed line has wrong number of columns: ") - dbot.warn(" \"" .. line .. "\"") + dbot.warn("Malformed line has wrong number of columns:\n\"" .. line .. "\"") return priEntry, DRL_RET_INVALID_PARAM end -- if end -- for if (numColumns == nil) then - dbot.warn("inv.priority.stringToTable: No valid lines were detected") + dbot.warn("No valid lines were detected in the priority") return priEntry, DRL_RET_INVALID_PARAM elseif (numColumns < 2) then - dbot.warn("inv.priority.stringToTable: Missing priority block column(s)") + dbot.warn("Missing one or more columns in the priority") return priEntry, DRL_RET_INVALID_PARAM end -- if -- Parse the header lines if (#lines < 2) then - dbot.warn("inv.priority.stringToTable: Missing header lines") + dbot.warn("Missing header lines in priority") return priEntry, DRL_RET_INVALID_PARAM end -- if local header1, retval = dbot.wordsToArray(lines[1]) if (retval ~= DRL_RET_SUCCESS) then - dbot.warn("inv.priority.stringToTable: Failed to convert header1 into array: " .. + dbot.warn("The priority's first line (part of the header) is malformed: " .. dbot.retval.getString(retval)) return priEntry, retval end -- if if (header1[1] ~= "MinLevel") then - dbot.warn("inv.priority.stringToTable: Missing Field header") + dbot.warn("Missing or malformed minLevel header line in priority") return priEntry, DRL_RET_INVALID_PARAM end -- if local header2, retval = dbot.wordsToArray(lines[2]) if (retval ~= DRL_RET_SUCCESS) then - dbot.warn("inv.priority.stringToTable: Failed to convert header2 into array: " .. + dbot.warn("The priority's second line (part of the header) is malformed: " .. dbot.retval.getString(retval)) return priEntry, retval end -- if if (header2[1] ~= "MaxLevel") then - dbot.warn("inv.priority.stringToTable: Missing field name header") + dbot.warn("Missing or malformed maxLevel header line in priority") return priEntry, DRL_RET_INVALID_PARAM end -- if @@ -10962,14 +10962,30 @@ function inv.priority.stringToTable(priorityString) minLevel = tonumber(minLevel or "") or 0 maxLevel = tonumber(maxLevel or "") or 0 + -- Ensure that there aren't any gaps in the level ranges. The minLevel for this block + -- should be exactly one more than the maxLevel from the previous block. + if (#priEntry > 0) and (priEntry[#priEntry].maxLevel + 1 ~= minLevel) then + dbot.warn("Detected level gap between consecutive priority blocks\n" .. + " Previous level block [" .. priEntry[#priEntry].minLevel .. "-" .. + priEntry[#priEntry].maxLevel .. "], current level block [" .. minLevel .. "-" .. + maxLevel .. "]") + return priEntry, DRL_RET_INVALID_PARAM + end -- if + table.insert(priEntry, { minLevel = minLevel, maxLevel = maxLevel, priorities = {} }) end -- for + -- The priority must start at level 1 and end at 291 + if (priEntry[1].minLevel ~= 1) or (priEntry[#priEntry].maxLevel ~= 291) then + dbot.warn("Priority must start at level 1 and continue to level 291") + return priEntry, DRL_RET_INVALID_PARAM + end -- if + -- For each priority field, add the field's value to each block entry for i = 3, #lines do local fieldLine, retval = dbot.wordsToArray(lines[i]) if (retval ~= DRL_RET_SUCCESS) then - dbot.warn("inv.priority.stringToTable: Failed to parse line \"" .. lines[i] .. "\"") + dbot.warn("Failed to parse priority line \"" .. lines[i] .. "\"") return priEntry, DRL_RET_INVALID_PARAM end -- if @@ -10984,16 +11000,22 @@ function inv.priority.stringToTable(priorityString) end -- if end -- if if (not fieldIsValid) then - dbot.warn("Unsupported priority field \"" .. (fieldName or "nil") .. "\" in line\n \"" .. + dbot.warn("Unsupported priority field \"" .. (fieldName or "nil") .. "\" in line\n \"" .. (lines[i] or "nil") .. "\"") return priEntry, DRL_RET_INVALID_PARAM end -- if for blockIdx, priorityBlock in ipairs(priEntry) do - local fieldValue = tonumber(fieldLine[blockIdx + 1] or "") -- add one to skip over the field name + local fieldValueRaw = fieldLine[blockIdx + 1] -- add one to skip over the field name + if (fieldValueRaw == nil) then + dbot.warn("Missing one or more columns for priority field \"" .. fieldName .. "\"") + return priEntry, DRL_RET_INVALID_PARAM + end -- if + + local fieldValue = tonumber(fieldValueRaw or "") if (fieldValue == nil) then - dbot.warn("inv.priority.stringToTable: Invalid field value at column " .. blockIdx + 1 .. - " in line \"" .. lines[i] .. "\"") + dbot.warn("Non-numeric field value in priority at column " .. blockIdx + 1 .. + " in line\n \"" .. lines[i] .. "\"") return priEntry, DRL_RET_INVALID_PARAM end -- if