annotate Queue.lua @ 61:d903b0a151d3

Command handler function is now private, no need to keep it global when you can use the global SlashCmdList["INVENTORIUM"](msg) instead. Added database updating mechanism. All database vars are now stored in profiles rather than global. Now refreshing options when a different profile is selected. Fixed an issue with minimum local and global stock values not being inherited from the defaults.
author Zerotorescue
date Wed, 22 Dec 2010 15:04:09 +0100
parents 58fb38f0b447
children fee06221176f
rev   line source
Zerotorescue@17 1 local addon = select(2, ...);
Zerotorescue@13 2 local mod = addon:NewModule("Queue", "AceEvent-3.0", "AceTimer-3.0");
Zerotorescue@13 3
Zerotorescue@13 4 function mod:OnEnable()
Zerotorescue@13 5 -- Register our own slash commands
Zerotorescue@13 6 addon:RegisterSlash(function()
Zerotorescue@36 7 mod:QueueAll();
Zerotorescue@36 8 end, { "q", "que", "queue" }, "|Hfunction:InventoriumCommandHandler:queue|h|cff00fff7/im queue|r|h (or /im q) - Queue all items found in the currently opened profession that are within the groups tracked at this current character.");
Zerotorescue@14 9
Zerotorescue@14 10 self:RegisterMessage("IM_QUEUE_ALL");
Zerotorescue@14 11 self:RegisterMessage("IM_QUEUE_GROUP");
Zerotorescue@14 12 end
Zerotorescue@14 13
Zerotorescue@14 14 function mod:IM_QUEUE_ALL()
Zerotorescue@14 15 self:QueueAll();
Zerotorescue@14 16 end
Zerotorescue@14 17
Zerotorescue@14 18 function mod:IM_QUEUE_GROUP(event, groupName)
Zerotorescue@14 19 self:QueueGroup(groupName);
Zerotorescue@13 20 end
Zerotorescue@13 21
Zerotorescue@13 22 function mod:QueueAll()
Zerotorescue@14 23 local playerName = UnitName("player");
Zerotorescue@14 24
Zerotorescue@14 25 -- Go through all groups
Zerotorescue@61 26 for groupName, values in pairs(addon.db.profile.groups) do
Zerotorescue@61 27 local trackAt = (values.trackAtCharacters or (values.trackAtCharacters == nil and addon.db.profile.defaults.trackAtCharacters));
Zerotorescue@14 28
Zerotorescue@14 29 if trackAt[playerName] then
Zerotorescue@14 30 self:QueueGroup(groupName);
Zerotorescue@13 31 end
Zerotorescue@13 32 end
Zerotorescue@13 33 end
Zerotorescue@13 34
Zerotorescue@13 35 function mod:QueueGroup(groupName)
Zerotorescue@61 36 if not addon.db.profile.groups[groupName] then
Zerotorescue@14 37 print(("Tried to queue items from a group named \"%s\", but no such group exists."):format(groupName));
Zerotorescue@14 38 return;
Zerotorescue@14 39 end
Zerotorescue@14 40
Zerotorescue@14 41 local temp = {};
Zerotorescue@13 42
Zerotorescue@13 43 -- Go through all trade skills for the profession
Zerotorescue@13 44 for i = 1, GetNumTradeSkills() do
Zerotorescue@13 45 -- Process every single tradeskill
Zerotorescue@14 46 self:ProcessTradeSkill(i, groupName, temp);
Zerotorescue@14 47 end
Zerotorescue@36 48
Zerotorescue@61 49 if addon.db.profile.groups[groupName].items then
Zerotorescue@61 50 for itemId, _ in pairs(addon.db.profile.groups[groupName].items) do
Zerotorescue@36 51 if not temp[itemId] then
Zerotorescue@36 52 local itemLink = select(2, GetItemInfo(itemId));
Zerotorescue@36 53
Zerotorescue@36 54 print("Couldn't queue " .. itemLink .. " (not part of this profession)");
Zerotorescue@36 55 end
Zerotorescue@14 56 end
Zerotorescue@13 57 end
Zerotorescue@13 58 end
Zerotorescue@13 59
Zerotorescue@14 60 function mod:ProcessTradeSkill(i, groupName, temp)
Zerotorescue@13 61 -- Try to retrieve the itemlink, this will be nil if current item is a group instead
Zerotorescue@13 62 local itemLink = GetTradeSkillItemLink(i);
Zerotorescue@13 63
Zerotorescue@13 64 if itemLink then
Zerotorescue@13 65 local itemId = addon:GetItemId(itemLink);
Zerotorescue@13 66 if not itemId then
Zerotorescue@13 67 -- If this isn't an item, it can only be an enchant instead
Zerotorescue@13 68 itemId = tonumber(itemLink:match("|Henchant:([-0-9]+)|h"));
Zerotorescue@13 69
Zerotorescue@17 70 itemId = addon.scrollIds[itemId]; -- change enchantIds into scrollIds
Zerotorescue@13 71 end
Zerotorescue@13 72
Zerotorescue@61 73 if addon.db.profile.groups[groupName].items[itemId] then
Zerotorescue@13 74 -- This item is in this group, queue it!
Zerotorescue@13 75
Zerotorescue@14 76 if temp then
Zerotorescue@14 77 -- Remember which items have been processed
Zerotorescue@14 78 temp[itemId] = true;
Zerotorescue@14 79 end
Zerotorescue@13 80
Zerotorescue@23 81 local currentStock = addon:GetItemCount(itemId, groupName);
Zerotorescue@31 82
Zerotorescue@14 83 if currentStock >= 0 then
Zerotorescue@14 84 -- Current stock will be -1 when no itemcount addon was found
Zerotorescue@31 85
Zerotorescue@31 86 -- Retrieve group settings
Zerotorescue@17 87 local restockTarget = addon:GetOptionByKey(groupName, "restockTarget");
Zerotorescue@17 88 local bonusQueue = addon:GetOptionByKey(groupName, "bonusQueue");
Zerotorescue@17 89 local minCraftingQueue = floor( addon:GetOptionByKey(groupName, "minCraftingQueue") * restockTarget );
Zerotorescue@13 90
Zerotorescue@31 91 -- Calculate the amount to be queued
Zerotorescue@17 92 local amount = ( restockTarget - currentStock );
Zerotorescue@17 93
Zerotorescue@17 94 if currentStock == 0 and bonusQueue > 0 then
Zerotorescue@31 95 -- If we have none left and the bonus queue is enabled, modify the amount to be queued
Zerotorescue@31 96
Zerotorescue@17 97 amount = floor( ( amount * ( bonusQueue + 1 ) ) + .5 ); -- round
Zerotorescue@17 98 end
Zerotorescue@17 99
Zerotorescue@17 100 if amount > 0 and amount >= minCraftingQueue then
Zerotorescue@31 101 -- If we are queueing at least one AND more than the minimum amount, then proceed
Zerotorescue@14 102
Zerotorescue@31 103 -- Auction value settings
Zerotorescue@31 104 local priceThreshold = addon:GetOptionByKey(groupName, "priceThreshold");
Zerotorescue@31 105
Zerotorescue@31 106 if priceThreshold == 0 or addon:GetAuctionValue(itemLink, groupName) >= priceThreshold then
Zerotorescue@31 107 -- If no price threshold is set or the auction value is equal to or larger than the price threshold, then proceed
Zerotorescue@31 108
Zerotorescue@31 109 self:Queue(i, amount, groupName);
Zerotorescue@31 110
Zerotorescue@31 111 print("Queued " .. amount .. " of " .. itemLink);
Zerotorescue@31 112 end
Zerotorescue@14 113 end
Zerotorescue@14 114 else
Zerotorescue@14 115 print("No usable itemcount addon found.");
Zerotorescue@13 116 end
Zerotorescue@13 117 end
Zerotorescue@13 118 end
Zerotorescue@13 119 end
Zerotorescue@13 120
Zerotorescue@23 121 function mod:Queue(tradeSkillIndex, amount, group)
Zerotorescue@13 122 tradeSkillIndex = tonumber(tradeSkillIndex);
Zerotorescue@13 123 amount = tonumber(amount);
Zerotorescue@13 124
Zerotorescue@13 125 if not tradeSkillIndex or not amount then return; end
Zerotorescue@13 126
Zerotorescue@23 127 local selectedExternalAddon = addon:GetOptionByKey(group, "craftingAddon");
Zerotorescue@23 128
Zerotorescue@23 129 if addon.supportedAddons.crafting[selectedExternalAddon] and addon.supportedAddons.crafting[selectedExternalAddon].IsEnabled() then
Zerotorescue@13 130 -- Try to use the default auction pricing addon
Zerotorescue@13 131
Zerotorescue@23 132 return addon.supportedAddons.crafting[selectedExternalAddon].Queue(tradeSkillIndex, amount);
Zerotorescue@13 133 else
Zerotorescue@13 134 -- Default not available, get the first one then
Zerotorescue@13 135
Zerotorescue@13 136 for name, value in pairs(addon.supportedAddons.crafting) do
Zerotorescue@13 137 if value.IsEnabled() then
Zerotorescue@13 138 return value.Queue(tradeSkillIndex, amount);
Zerotorescue@13 139 end
Zerotorescue@13 140 end
Zerotorescue@13 141 end
Zerotorescue@13 142
Zerotorescue@13 143 return -2;
Zerotorescue@13 144 end