Version 2.0024

1) Fixed triggers that did not handle when the mud was in compact mode.  This could
   result in timeouts because triggers that depended on hitting an empty line would
   not match the compacted output.
2) Fixed case where a user accessed containers before a build was complete.  The
   previous code could assert errors if invmon tried to access unidentified items.
master
Durel 7 years ago
parent e861934882
commit 65f84177ba

@ -2,6 +2,19 @@
dbot.changelog = {} dbot.changelog = {}
dbot.changelog[2.0024] =
{
{ change = drlDbotChangeLogTypeFix,
desc = [[Fixed triggers that did not handle when the mud was in compact mode. This could
result in timeouts because triggers that depended on hitting an empty line would
not match the compacted output.]]
},
{ change = drlDbotChangeLogTypeFix,
desc = [[Fixed case where a user accessed containers before a build was complete. The
previous code could assert errors if invmon tried to access unidentified items.]]
}
}
dbot.changelog[2.0023] = dbot.changelog[2.0023] =
{ {
{ change = drlDbotChangeLogTypeMisc, { change = drlDbotChangeLogTypeMisc,

@ -88,7 +88,7 @@ dbot.version : Module to track version and changelog information and update the
save_state="y" save_state="y"
date_written="2017-08-12 08:45:15" date_written="2017-08-12 08:45:15"
requires="4.98" requires="4.98"
version="2.0023" version="2.0024"
> >
<description trim="y"> <description trim="y">
<![CDATA[ <![CDATA[
@ -4844,7 +4844,10 @@ function inv.items.init.atInstall()
-- Trigger on one of the detail/stat lines of an item's id report (lore, identify, bid, etc.) -- Trigger on one of the detail/stat lines of an item's id report (lore, identify, bid, etc.)
check (AddTriggerEx(inv.items.trigger.itemIdStatsName, check (AddTriggerEx(inv.items.trigger.itemIdStatsName,
"^(\\| .*\\|| A full appraisal will reveal further information on this item.)$", "^(" ..
"\\| .*\\||" ..
".*A full appraisal will reveal further information on this item.|" ..
")$",
"inv.items.trigger.itemIdStats(\"%1\")", "inv.items.trigger.itemIdStats(\"%1\")",
drlTriggerFlagsBaseline + trigger_flag.OmitFromOutput, drlTriggerFlagsBaseline + trigger_flag.OmitFromOutput,
custom_colour.Custom11, 0, "", "", sendto.script, 0)) custom_colour.Custom11, 0, "", "", sendto.script, 0))
@ -4878,15 +4881,17 @@ function inv.items.init.atInstall()
-- Trigger on an identify command to capture the item's object ID -- Trigger on an identify command to capture the item's object ID
check (AddTriggerEx(inv.items.trigger.idItemName, check (AddTriggerEx(inv.items.trigger.idItemName,
"^(" .. "^(" ..
".------.*|" .. ".------.*|" ..
"\\|.*|" .. "\\|.*|" ..
"You do not have that item.*|" .. "You do not have that item.*|" ..
"You dream about being able to identify.*|" .. "You dream about being able to identify.*|" ..
".*does not have that item for sale.*|" .. ".*does not have that item for sale.*|" ..
"There is no auction item with that id.*|" .. "There is no auction item with that id.*|" ..
".*currently holds no inventory.*|" .. ".*currently holds no inventory.*|" ..
"There is no marketplace item with that id.*" .. "There is no marketplace item with that id.*|" ..
"|)$", -- accept an empty capture on the last line inv.items.identifyFence ..
"|)$", -- accept an empty capture on the last line if there is one there
"inv.items.trigger.idItem(\"%1\")", "inv.items.trigger.idItem(\"%1\")",
drlTriggerFlagsBaseline + trigger_flag.OmitFromOutput, drlTriggerFlagsBaseline + trigger_flag.OmitFromOutput,
custom_colour.Custom11, 0, "", "", sendto.script, 0)) custom_colour.Custom11, 0, "", "", sendto.script, 0))
@ -5615,7 +5620,7 @@ function inv.items.identifyCR(maxNumItems, refreshLocations)
else else
numItemsIdentified = numItemsIdentified + 1 numItemsIdentified = numItemsIdentified + 1
dbot.note("Identify (" .. numItemsIdentified .. " / " .. numItemsToIdentify .. dbot.note("Identify (" .. numItemsIdentified .. " / " .. numItemsToIdentify ..
") \"" .. (colorName or name or "Unidentified") .. "@W" .. DRL_ANSI_WHITE .. "): \"" .. (colorName or name or "Unidentified") .. "@W" .. DRL_ANSI_WHITE ..
"\" (" .. objId .. ") from frequent cache") "\" (" .. objId .. ") from frequent cache")
end -- if end -- if
end -- if end -- if
@ -5718,6 +5723,7 @@ end -- inv.items.identifyCR
idCommandBasic = "identify" idCommandBasic = "identify"
inv.items.identifyFence = "DINV identify fence"
-- Asynchronous routine to identify an item -- Asynchronous routine to identify an item
function inv.items.identifyItem(objId, idCommand, resultData, commandArray) function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
local retval = DRL_RET_SUCCESS local retval = DRL_RET_SUCCESS
@ -5754,6 +5760,8 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
inv.items.identifyPkg.objLoc = objLoc inv.items.identifyPkg.objLoc = objLoc
inv.items.identifyPkg.command = idCommand inv.items.identifyPkg.command = idCommand
local tmpCommands = {}
if (commandArray == nil) then if (commandArray == nil) then
-- Add a timeout timer to clear the identify request if we take too long. For example, -- Add a timeout timer to clear the identify request if we take too long. For example,
-- we may have tried to identify an item that isn't in our inventory table or we may have -- we may have tried to identify an item that isn't in our inventory table or we may have
@ -5772,8 +5780,10 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
if (commandArray ~= nil) then if (commandArray ~= nil) then
table.insert(commandArray, command) table.insert(commandArray, command)
else else
retval = dbot.execute.safe.command(command, inv.items.identifyItemSetupFn, nil, table.insert(tmpCommands, command)
dbot.callback.default, resultData) table.insert(tmpCommands, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(tmpCommands, inv.items.identifyItemSetupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -5790,8 +5800,10 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
if (commandArray ~= nil) then if (commandArray ~= nil) then
table.insert(commandArray, command) table.insert(commandArray, command)
else else
retval = dbot.execute.safe.command(command, inv.items.identifyItemSetupFn, nil, table.insert(tmpCommands, command)
dbot.callback.default, resultData) table.insert(tmpCommands, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(tmpCommands, inv.items.identifyItemSetupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -5831,12 +5843,14 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
-- Auction (we may temporarily add an auction item to examine it) -- Auction (we may temporarily add an auction item to examine it)
elseif (objLoc == invItemLocAuction) then elseif (objLoc == invItemLocAuction) then
command = idCommand .. " " .. objId command = idCommand .. " " .. objId
if (commandArray ~= nil) then if (commandArray ~= nil) then
table.insert(commandArray, command) table.insert(commandArray, command)
else else
retval = dbot.execute.safe.command(command, inv.items.identifyItemSetupFn, nil, table.insert(tmpCommands, command)
dbot.callback.default, resultData) table.insert(tmpCommands, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(tmpCommands, inv.items.identifyItemSetupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -5850,8 +5864,10 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
if (commandArray ~= nil) then if (commandArray ~= nil) then
table.insert(commandArray, idCommand) table.insert(commandArray, idCommand)
else else
retval = dbot.execute.safe.command(idCommand, inv.items.identifyItemSetupFn, nil, table.insert(tmpCommands, idCommand)
dbot.callback.default, resultData) table.insert(tmpCommands, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(tmpCommands, inv.items.identifyItemSetupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -5871,8 +5887,10 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
if (commandArray ~= nil) then if (commandArray ~= nil) then
table.insert(commandArray, command) table.insert(commandArray, command)
else else
retval = dbot.execute.safe.command(command, inv.items.identifyItemSetupFn, nil, table.insert(tmpCommands, command)
dbot.callback.default, resultData) table.insert(tmpCommands, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(tmpCommands, inv.items.identifyItemSetupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -5894,8 +5912,10 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
if (commandArray ~= nil) then if (commandArray ~= nil) then
table.insert(commandArray, command) table.insert(commandArray, command)
else else
retval = dbot.execute.safe.command(command, inv.items.identifyItemSetupFn, nil, table.insert(tmpCommands, command)
dbot.callback.default, resultData) table.insert(tmpCommands, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(tmpCommands, inv.items.identifyItemSetupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -5918,6 +5938,8 @@ function inv.items.identifyItem(objId, idCommand, resultData, commandArray)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
inv.items.trigger.itemIdEnd() inv.items.trigger.itemIdEnd()
end -- if end -- if
else
table.insert(commandArray, "echo " .. inv.items.identifyFence)
end -- if end -- if
return retval return retval
@ -7874,8 +7896,12 @@ function inv.items.convertRelative(relativeName, value)
inv.lastIdentifiedObjectId = nil inv.lastIdentifiedObjectId = nil
local resultData = dbot.callback.new() local resultData = dbot.callback.new()
retval = dbot.execute.safe.command("identify " .. value, inv.items.convertSetupFn, nil,
dbot.callback.default, resultData) local commandArray = {}
table.insert(commandArray, "identify " .. value)
table.insert(commandArray, "echo " .. inv.items.identifyFence)
retval = dbot.execute.safe.commands(commandArray, inv.items.convertSetupFn, nil,
dbot.callback.default, resultData)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.items.convertRelative: Failed to submit safe identification call: " .. dbot.warn("inv.items.convertRelative: Failed to submit safe identification call: " ..
dbot.retval.getString(retval)) dbot.retval.getString(retval))
@ -8833,7 +8859,7 @@ function inv.items.trigger.itemIdStart(line)
-- Watch for the end of the item description so that we can stop scanning -- Watch for the end of the item description so that we can stop scanning
AddTriggerEx(inv.items.trigger.itemIdEndName, AddTriggerEx(inv.items.trigger.itemIdEndName,
"^$", inv.items.identifyFence,
"inv.items.trigger.itemIdEnd()", "inv.items.trigger.itemIdEnd()",
drlTriggerFlagsBaseline + trigger_flag.OmitFromOutput + trigger_flag.OneShot, drlTriggerFlagsBaseline + trigger_flag.OmitFromOutput + trigger_flag.OneShot,
custom_colour.Custom11, custom_colour.Custom11,
@ -9436,8 +9462,8 @@ end -- inv.items.trigger.itemIdEnd
inv.items.trigger.idItemName = "drlInvItemsTriggerIdItem" inv.items.trigger.idItemName = "drlInvItemsTriggerIdItem"
inv.items.trigger.lastLineHyphens = false
function inv.items.trigger.idItem(line) function inv.items.trigger.idItem(line)
local _, _, id = string.find(line, "Id%s+:%s+(%d+)%s+") local _, _, id = string.find(line, "Id%s+:%s+(%d+)%s+")
if (id ~= nil) then if (id ~= nil) then
inv.lastIdentifiedObjectId = id inv.lastIdentifiedObjectId = id
@ -9446,15 +9472,8 @@ function inv.items.trigger.idItem(line)
if (line == "You do not have that item.") then if (line == "You do not have that item.") then
dbot.debug("You do not have the relative item.") dbot.debug("You do not have the relative item.")
inv.lastIdentifiedObjectId = 0 inv.lastIdentifiedObjectId = 0
elseif (inv.items.trigger.lastLineHyphens == true) and ((line == nil) or (line == "")) then elseif (line == inv.items.identifyFence) then
EnableTrigger(inv.items.trigger.idItemName, false) EnableTrigger(inv.items.trigger.idItemName, false)
dbot.debug("Disabling ID trigger on line=\"" .. line .. "\"")
end -- if
if (string.find(line, "^[+][-]+[+]")) then
inv.items.trigger.lastLineHyphens = true
else
inv.items.trigger.lastLineHyphens = false
end -- if end -- if
end -- inv.items.trigger.idItem end -- inv.items.trigger.idItem
@ -9661,6 +9680,17 @@ function inv.items.trigger.invmon(action, objId, containerId, wearLoc)
return DRL_RET_INVALID_PARAM return DRL_RET_INVALID_PARAM
end -- if end -- if
if (inv.items.getEntry(objId) == nil) or
(containerId ~= -1) and (inv.items.getEntry(containerId) == nil) then
dbot.debug("Skipping invmon for unknown item and/or container")
return DRL_RET_MISSING_ENTRY
end -- if
if (not inv.config.table.isBuildExecuted) then
dbot.debug("Skipping invmon, build is not complete yet")
return DRL_RET_UNINITIALIZED
end -- if
-- Get the action -- Get the action
assert(invmon.action[action] ~= nil, "Undefined invmon action " .. action) assert(invmon.action[action] ~= nil, "Undefined invmon action " .. action)
@ -12172,33 +12202,6 @@ function inv.priority.addDefault()
dbot.retval.getString(retval)) dbot.retval.getString(retval))
end -- if end -- if
--[[FIXME: we probably shouldn't bundle this one
retval = inv.priority.add(
"cleric-tank",
{
{ -- Priorities for levels 1 - 291
minLevel = 1,
maxLevel = 291,
priorities = {
str = 1.2,
int = 1.2,
wis = 1.5,
dex = 1.3,
con = 1.5,
luck = 1.3,
hit = 0.5,
dam = 0.5,
avedam = 0.4,
offhandDam = 0.4,
}
}
})
if (retval ~= DRL_RET_SUCCESS) then
dbot.warn("inv.priority.addDefault: Failed to add priority \"cleric-tank\": " ..
dbot.retval.getString(retval))
end -- if
--]]
---------------------- ----------------------
-- Priority: psi-melee -- Priority: psi-melee
---------------------- ----------------------
@ -14362,7 +14365,7 @@ function inv.set.covetCR()
-- Attempt to identify the auction item and wait until we have confirmation that the ID completed -- Attempt to identify the auction item and wait until we have confirmation that the ID completed
local resultData = dbot.callback.new() local resultData = dbot.callback.new()
retval = inv.items.identifyItem(objId, auctionCmd, resultData) retval = inv.items.identifyItem(objId, auctionCmd, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
retval = dbot.callback.wait(resultData, inv.items.timer.idTimeoutThresholdSec) retval = dbot.callback.wait(resultData, inv.items.timer.idTimeoutThresholdSec)
if (retval ~= DRL_RET_SUCCESS) then if (retval ~= DRL_RET_SUCCESS) then
@ -19805,8 +19808,12 @@ function dbot.ability.isAvailable(ability, level)
-- Kick off the command that will trigger the level availability info -- Kick off the command that will trigger the level availability info
local resultData = dbot.callback.new() local resultData = dbot.callback.new()
retval = dbot.execute.safe.command("showskill " .. ability, dbot.ability.setupFn, nil,
dbot.callback.default, resultData) local commandArray = {}
table.insert(commandArray, "showskill " .. ability)
table.insert(commandArray, "echo " .. dbot.ability.trigger.levelMsg)
retval = dbot.execute.safe.commands(commandArray, dbot.ability.setupFn, nil,
dbot.callback.default, resultData)
if (retval == DRL_RET_SUCCESS) then if (retval == DRL_RET_SUCCESS) then
-- Wait for the callback to confirm that the showskill safe command completed -- Wait for the callback to confirm that the showskill safe command completed
retval = dbot.callback.wait(resultData, 10) retval = dbot.callback.wait(resultData, 10)
@ -19868,17 +19875,18 @@ function drlHaveAbilityStartTriggerFn(line)
end -- if end -- if
-- Enable a trigger to watch for the output of the ability availability output. The trigger -- Enable a trigger to watch for the output of the ability availability output. The trigger
-- will disable itself when it sees an empty line that indicates the output is done. -- will disable itself when it sees a fence message that indicates the output is done.
EnableTrigger(dbot.ability.trigger.levelName, true) EnableTrigger(dbot.ability.trigger.levelName, true)
end -- drlHaveAbilityStartTriggerFn end -- drlHaveAbilityStartTriggerFn
dbot.ability.trigger.levelMsg = "DINV showskill fence"
function dbot.ability.trigger.levelFn(line) function dbot.ability.trigger.levelFn(line)
local useLevel local useLevel
_, _, useLevel = string.find(line, "Your Level%s+:%s+(%d+)") _, _, useLevel = string.find(line, "Your Level%s+:%s+(%d+)")
-- If we hit an empty line, we know that the output is done and we can disable this trigger -- If we our fence echo message, we know that the output is done and we can disable this trigger
if (line == "") then if (line == dbot.ability.trigger.levelMsg) then
EnableTrigger(dbot.ability.trigger.levelName, false) EnableTrigger(dbot.ability.trigger.levelName, false)
-- If we can't use the skill, set the useLevel out of reach -- If we can't use the skill, set the useLevel out of reach
@ -19887,7 +19895,7 @@ function dbot.ability.trigger.levelFn(line)
-- Check if we found our level in a line like: "Your Level : 22 Learned: 95% " -- Check if we found our level in a line like: "Your Level : 22 Learned: 95% "
elseif (useLevel ~= nil) and (tonumber(useLevel) ~= nil) then elseif (useLevel ~= nil) and (tonumber(useLevel) ~= nil) then
dbot.abilityPkg.useLevel = tonumber(useLevel) dbot.abilityPkg.useLevel = tonumber(useLevel) or 300
end -- if end -- if
end -- dbot.ability.trigger.levelFn end -- dbot.ability.trigger.levelFn
@ -19952,7 +19960,7 @@ function dbot.wish.init.atActive()
dbot.warn("dbot.wish.init.atActive: Failed to load wish data: " .. dbot.retval.getString(retval)) dbot.warn("dbot.wish.init.atActive: Failed to load wish data: " .. dbot.retval.getString(retval))
end -- if end -- if
-- Trigger on the output of "wish list" and watch for an empty line indicating that we are done -- Trigger on the output of "wish list" and watch for a fence message to tell us we are done
check (AddTriggerEx(dbot.wish.trigger.itemName, check (AddTriggerEx(dbot.wish.trigger.itemName,
"^(.*)$", "^(.*)$",
"dbot.wish.trigger.fn(\"%1\")", "dbot.wish.trigger.fn(\"%1\")",
@ -20053,6 +20061,7 @@ function dbot.wish.get()
end -- dbot.wish.get end -- dbot.wish.get
dbot.wish.fenceMsg = "DINV wish list fence"
function dbot.wish.getCR() function dbot.wish.getCR()
local retval = DRL_RET_SUCCESS local retval = DRL_RET_SUCCESS
local charState = dbot.gmcp.getState() local charState = dbot.gmcp.getState()
@ -20076,9 +20085,11 @@ function dbot.wish.getCR()
if (pageLines == 0) then if (pageLines == 0) then
table.insert(commandArray, "wish list") table.insert(commandArray, "wish list")
table.insert(commandArray, "echo " .. dbot.wish.fenceMsg)
else else
table.insert(commandArray, "pagesize 0") table.insert(commandArray, "pagesize 0")
table.insert(commandArray, "wish list") table.insert(commandArray, "wish list")
table.insert(commandArray, "echo " .. dbot.wish.fenceMsg)
table.insert(commandArray, "pagesize " .. pageLines) table.insert(commandArray, "pagesize " .. pageLines)
end -- if end -- if
@ -20137,7 +20148,8 @@ end -- dbot.wish.getCR
function dbot.wish.trigger.fn(line) function dbot.wish.trigger.fn(line)
local wishName = string.match(line, ".*[-][-] ([^ -]+)[ ]*$") local wishName = string.match(line, ".*[-][-] ([^ -]+)[ ]*$")
if (line == nil) or (line == "") then -- We send a fence after checking with wishes to confirm that the wishes are done
if (line == dbot.wish.fenceMsg) then
EnableTrigger(dbot.wish.trigger.itemName, false) EnableTrigger(dbot.wish.trigger.itemName, false)
dbot.wish.inProgress = false dbot.wish.inProgress = false
end -- if end -- if
@ -20216,7 +20228,7 @@ dbot.pagesize.trigger.suppressName = "drlDbotPageSizeSuppressTrigger"
function dbot.pagesize.init.atActive() function dbot.pagesize.init.atActive()
local retval = DRL_RET_SUCCESS local retval = DRL_RET_SUCCESS
-- Trigger on the output of "pagesize" and watch for an empty line indicating that we are done -- Trigger on the output of "pagesize"
check (AddTriggerEx(dbot.pagesize.trigger.getName, check (AddTriggerEx(dbot.pagesize.trigger.getName,
"^(" .. "^(" ..
"|You currently display [0-9]+ lines per page." .. "|You currently display [0-9]+ lines per page." ..
@ -20643,7 +20655,7 @@ function dbot.execute.queue.fence()
-- Spin until we have confirmation that the mud received the fence message or until we detect -- Spin until we have confirmation that the mud received the fence message or until we detect
-- that we are in a state that will prevent the message from completing -- that we are in a state that will prevent the message from completing
totTime = 0 totTime = 0
timeout = 60 -- wait a while since we there might be a lot of stuff queued up on the server timeout = 30 -- wait a while since we there might be a lot of stuff queued up on the server
while (dbot.execute.fenceIsDetected == false) do while (dbot.execute.fenceIsDetected == false) do
local charState = dbot.gmcp.getState() local charState = dbot.gmcp.getState()

Loading…
Cancel
Save