From 28a8d71988cfc8223e333c1c237dbcabc928b2fa Mon Sep 17 00:00:00 2001 From: pschifferer Date: Sun, 15 Mar 2009 14:40:27 +0000 Subject: [PATCH] Added an override (hold down shift and control when opening tradeskill) that will open the standard frame instead of Cauldron, and corresponding command-line switches to enable/disable Cauldron. Added a bag scanning function so that the item deltas function is more reliable. Added some merchant scanning functions in preparation for the auto-buy functionality (and the button is now temporarily removed from the shopping list window). Updated the pkgmeta file to include WoWUnit, so that I can do unit testing (yay!). Added a stub unit test file for the unit tests that will be coming soon. --- .pkgmeta | 3 +++ Cauldron.toc | 7 ++++-- CauldronMain.lua | 22 +++++++++++++++++ CauldronMainUI.lua | 28 ++++++++++++---------- CauldronShoppingList.lua | 60 ++++++++++++++++++++++++++++++++++++++++++++++ CauldronShoppingList.xml | 4 ++-- CauldronUnitTests.lua | 32 +++++++++++++++++++++++++ CauldronUtil.lua | 51 +++++++++++++++++++++++++++++---------- Locale/Cauldron-enUS.lua | 4 ++++ 9 files changed, 181 insertions(+), 30 deletions(-) create mode 100644 CauldronUnitTests.lua diff --git a/.pkgmeta b/.pkgmeta index 6b702e5..74ce385 100644 --- a/.pkgmeta +++ b/.pkgmeta @@ -39,3 +39,6 @@ externals: Libs/LibLogger-1.0: url: svn://svn.wowace.com/wow/liblogger-1-0/mainline/trunk/LibLogger-1.0 tag: latest + Libs/WoWUnit-1.0.9: + url: svn://svn.wowace.com/wow/wowunit/mainline/trunk + tag: latest diff --git a/Cauldron.toc b/Cauldron.toc index d83f38c..dab36f8 100755 --- a/Cauldron.toc +++ b/Cauldron.toc @@ -4,14 +4,14 @@ ## Author: Caendra of Silver Hand ## Notes: An improved interface for your trade skills ## RequiredDeps: -## OptionalDeps: Ace3, LibStub, LibDataBroker-1.1, LibPeriodicTable-3.1 +## OptionalDeps: Ace3, LibStub, LibDataBroker-1.1 ## SavedVariables: CauldronDB ## SavedVariablesPerCharacter: ## DefaultState: enabled ## X-Name: Cauldron ## X-Category: Tradeskill ## X-eMail: dm AT critical DASH failure DOT org -## X-Embeds: Ace3, LibPeriodicTable-3.1 +## X-Embeds: Ace3 #@no-lib-strip@ #### List of embedded libraries @@ -33,3 +33,6 @@ CauldronShoppingListUI.lua CauldronMain.xml CauldronShoppingList.xml +#@alpha@ +CauldronUnitTests.lua +#@end-alpha@ \ No newline at end of file diff --git a/CauldronMain.lua b/CauldronMain.lua index 294707d..4902e16 100644 --- a/CauldronMain.lua +++ b/CauldronMain.lua @@ -57,6 +57,18 @@ function Cauldron:OnInitialize() type = 'execute', func = function() Cauldron:ShowShoppingList() end, }, + enable = { + name = L["Enable Cauldron"], + desc = L["Use Cauldron as your tradeskill interface"], + type = 'execute', + func = function() Cauldron:Enable() end, + }, + disable = { + name = L["Disable Cauldron"], + desc = L["Use the standard Blizzard window as your tradeskill interface"], + type = 'execute', + func = function() Cauldron:Disable() end, + }, version = { name = L["Version"], desc = L["Shows the version number of the addon"], @@ -971,6 +983,16 @@ end --]] +function Cauldron:Enable() + Cauldron.vars.enabled = true; +end + +function Cauldron:Disable() + Cauldron.vars.enabled = false; + + Cauldron:Frame_Hide(); +end + function Cauldron:Reset() self:Print("Resetting data structures..."); diff --git a/CauldronMainUI.lua b/CauldronMainUI.lua index 745721e..ea1f9fc 100644 --- a/CauldronMainUI.lua +++ b/CauldronMainUI.lua @@ -10,37 +10,39 @@ function Cauldron:Frame_Show() self:debug("Frame_Show enter"); --@end-alpha@ + if Cauldron.vars.enable and not(IsShiftKeyDown() and IsControlKeyDown()) then --@alpha@ - self:debug("Frame_Show: close dropdown menus"); + self:debug("Frame_Show: close dropdown menus"); --@end-alpha@ - CloseDropDownMenus(); + CloseDropDownMenus(); -- self:UpdateFramePosition(); -- self:UpdateFrameStrata(); --@alpha@ - self:debug("Frame_Show: show our frame"); + self:debug("Frame_Show: show our frame"); --@end-alpha@ - ShowUIPanel(CauldronFrame); + ShowUIPanel(CauldronFrame); - if TradeSkillFrame then + if TradeSkillFrame then --@alpha@ - self:debug("Frame_Show: hide the original tradeskill frame"); + self:debug("Frame_Show: hide the original tradeskill frame"); --@end-alpha@ - -- hide the original tradeskill frame - TradeSkillFrame:SetAlpha(0); - TradeSkillFrame:ClearAllPoints(); - TradeSkillFrame:SetPoint("TOPLEFT", 0, 900); + -- hide the original tradeskill frame + TradeSkillFrame:SetAlpha(0); + TradeSkillFrame:ClearAllPoints(); + TradeSkillFrame:SetPoint("TOPLEFT", 0, 900); -- CauldronFrame:SetPoint("TOPLEFT", TradeSkillFrame, "TOPLEFT", 0, 0); end - self:RegisterMessage("Cauldron_Update", "OnCauldronUpdate"); + self:RegisterMessage("Cauldron_Update", "OnCauldronUpdate"); --@alpha@ - self:debug("Frame_Show: call Frame_Update()"); + self:debug("Frame_Show: call Frame_Update()"); --@end-alpha@ - self:Frame_Update(); + self:Frame_Update(); + end --@alpha@ self:debug("Frame_Show exit"); diff --git a/CauldronShoppingList.lua b/CauldronShoppingList.lua index 17f69c9..f07ad49 100644 --- a/CauldronShoppingList.lua +++ b/CauldronShoppingList.lua @@ -156,4 +156,64 @@ function CauldronShopping:EmptyShoppingList(list, requestor) end function CauldronShopping:AutoBuyShoppingItems(list, requestor) + + if not list then + Cauldron:warn("CauldronShopping:AutoBuyShoppingItems: missing list!"); + return; + end + + local merchant = Cauldron:GetMerchantItems(); + + -- TODO: remove + -- store merchant items in the DB + if not Cauldron.db.realm.userdata[Cauldron.vars.playername].merchant then + Cauldron.db.realm.userdata[Cauldron.vars.playername].merchant = {}; + end + for item, info in pairs(merchant) do + Cauldron.db.realm.userdata[Cauldron.vars.playername].merchant[item] = info; + end + + -- iterate over shopping list + --[[ + for r, _ in pairs(list) do + for item, amount in pairs(r) do + -- check if the merchant has the item and it can be purchased + if merchant[item] then + CauldronShopping:BuyItem(item, merchant[item], amount); + end + end + end + --]] + +end + +function CauldronShopping:BuyItem(item, merchInfo, amount) + + if (not merchInfo) or (not amount) or (amount < 1) then + Cauldron:warn("CauldronShopping:BuyItem: missing merchant item info or invalid amount!"); + return; + end + + -- figure out how many to purchase, accounting for stacks + local stacks = 1; + local purchases = 1; + + if amount > 1 then + end + + local total = purchases * merchInfo.quantity; + + local qtyInfo = string.format(L["(%1$d total)"], total); + if stacks > 1 then + qtyInfo = string.format(L["(%1$d stacks, %2$d total)"], stacks, total); + end + + -- tell the user, because that's the right thing to do + Cauldron:Print(string.format(L["Purchasing %1$s from merchant %2$s..."], item, qtyInfo)); + + -- buy the items + for i=1,purchases do + -- BuyMerchantItem(merchInfo.index, stacks); + end + end diff --git a/CauldronShoppingList.xml b/CauldronShoppingList.xml index 8a270db..d96194d 100644 --- a/CauldronShoppingList.xml +++ b/CauldronShoppingList.xml @@ -190,6 +190,7 @@ + diff --git a/CauldronUnitTests.lua b/CauldronUnitTests.lua new file mode 100644 index 0000000..fc4f8c4 --- /dev/null +++ b/CauldronUnitTests.lua @@ -0,0 +1,32 @@ +-- unit tests +-- $Revision$ + +local CauldronTestSuite = { + mocks = { + GetItemCount = function(arg) + return 1; + end; + }; + setUp = function() + return {}; + end; + tearDown = function() + -- no tear down required + end; + -- core tests + -- UI tests + -- queue tests + -- shopping tests + -- shopping UI tests + -- tradeskill tests + -- util tests + testIsVendorItem = function() + assert(Cauldron:IsVendorItem(12345), "12345 should be a vendor item"); + end; + testGetPotentialCraftCount = function() + assert(true, ""); + end; +}; + +WoWUnit:AddTestSuite("CauldronTestSuite", CauldronTestSuite); + diff --git a/CauldronUtil.lua b/CauldronUtil.lua index 4b55597..007b003 100644 --- a/CauldronUtil.lua +++ b/CauldronUtil.lua @@ -130,7 +130,24 @@ function Cauldron:GetNameFromLink(link) end function Cauldron:ScanBags() - -- TODO + + -- reset inventory + self.vars.inventory = {}; + + -- process keyring and inventory bags + for _,bagid in ipairs({-2,0,1,2,3,4}) do + -- iterate over bag + for i=1,GetContainerNumSlots(bagid) do + local link = GetContainerItemLink(bagid, i); + if link then + local name = select(1, {GetItemInfo(link)}); + local count = GetItemCount(link); + + self.vars.inventory[name] = count; + end + end + end + end function Cauldron:GetItemDeltas(bagid) @@ -164,22 +181,30 @@ function Cauldron:GetItemDeltas(bagid) -- save the delta information deltas[name] = delta; end - - -- store the bag slot information - if count > 0 then - inv[name] = count; - else - inv[name] = nil; - end end end return deltas; end -function Cauldron:IsKeyReagent(itemName) - - -- TODO - - return false; +function Cauldron:GetMerchantItems() + + local items = {}; + + for i=1,GetMerchantNumItems() do + local name, _, price, quantity, avail, _, extCost = GetMerchantItemInfo(i); + local maxStack = GetMerchantItemMaxStack(i); + + if avail > 0 then + items[name] = { + ['index'] = i, + ['price'] = price, + ['quantity'] = quantity, + ['available'] = avail, + ['maxStack'] = maxStack, + }; + end + end + + return items; end diff --git a/Locale/Cauldron-enUS.lua b/Locale/Cauldron-enUS.lua index 2ffdca0..9f43311 100644 --- a/Locale/Cauldron-enUS.lua +++ b/Locale/Cauldron-enUS.lua @@ -115,6 +115,10 @@ L["Available at vendor"] = true L["Click to queue the listed amount of this item"] = true L["Shift-click to queue the listed potential amount of this item"] = true +L["Purchasing %1$s from merchant %2$d..."] = true +L["(%1$d stacks, %2$d total)"] = true +L["(%1$d total)"] = true + -- error messages L["Crafting %1$s requires the %2$s skill."] = true -- 1.7.9.5