------------------------------------------------------------------------------- -- Config.lua -- -- AuctionLite configuration stuff. ------------------------------------------------------------------------------- local _ local L = LibStub("AceLocale-3.0"):GetLocale("AuctionLite", false) local DBName = "AuctionLiteDB"; ------------------------------------------------------------------------------- -- First, tables of options ------------------------------------------------------------------------------- -- Currently no slash commands... local Options = { type = "group", get = function(item) return AuctionLite.db.profile[item[#item]] end, set = function(item, value) AuctionLite.db.profile[item[#item]] = value end, args = { storePrices = { type = "toggle", desc = L["Store price data for all items seen (disable to save memory)."], name = L["Store Price Data"], order = 4, }, clearData = { type = "execute", handler = AuctionLite, func = "ClearData", desc = L["Clear all auction house price data."], name = L["Clear All Data"], order = 6, }, openBags = { type = "toggle", desc = L["Open all your bags when you visit the auction house."], name = L["Open All Bags at AH"], width = "double", order = 8, }, startTab = { type = "select", desc = L["Choose which tab is selected when opening the auction house."], name = L["Start Tab"], style = "dropdown", values = { a_default = L["Default"], b_buy = L["Buy Tab"], c_sell = L["Sell Tab"], d_last = L["Last Used Tab"], }, order = 12, }, }, }; local BuyOptions = { type = "group", get = function(item) return AuctionLite.db.profile[item[#item]] end, set = function(item, value) AuctionLite.db.profile[item[#item]] = value end, args = { minProfit = { type = "range", desc = L["Deals must be below the historical price by this much gold."], name = L["Minimum Profit (Gold)"], min = 0, max = 1000, step = 10, order = 5, }, minDiscount = { type = "range", desc = L["Deals must be below the historical price by this percentage."], name = L["Minimum Profit (Pct)"], isPercent = true, min = 0, max = 1, step = 0.01, order = 6, }, getAll = { type = "toggle", desc = L["Use fast method for full scans (may cause disconnects)."], name = L["Fast Auction Scan"], width = "double", order = 7, }, countMyListings = { type = "toggle", desc = L["On the summary view, show how many listings/items are yours."], name = L["Show How Many Listings are Mine"], width = "double", order = 8, }, considerResale = { type = "toggle", desc = L["Consider resale value of excess items when filling an order on the \"Buy\" tab."], name = L["Consider Resale Value When Buying"], width = "double", order = 9, }, }, }; local SellOptions = { type = "group", get = function(item) return AuctionLite.db.profile[item[#item]] end, set = function(item, value) AuctionLite.db.profile[item[#item]] = value end, args = { bidUndercut = { type = "range", desc = L["Percent to undercut market value for bid prices (0-100)."], name = L["Bid Undercut"], isPercent = true, min = 0, max = 1, step = 0.01, order = 1, }, buyoutUndercut = { type = "range", desc = L["Percent to undercut market value for buyout prices (0-100)."], name = L["Buyout Undercut"], isPercent = true, min = 0, max = 1, step = 0.01, order = 2, }, bidUndercutFixed = { name = L["Bid Undercut (Fixed)"], desc = L["Fixed amount to undercut market value for bid prices (e.g., 1g 2s 3c)."], type = "input", order = 3, handler = AuctionLite, get = "GetFixedBidUndercut", set = "SetFixedBidUndercut", }, buyoutUndercutFixed = { name = L["Buyout Undercut (Fixed)"], desc = L["Fixed amount to undercut market value for buyout prices (e.g., 1g 2s 3c)."], type = "input", order = 4, handler = AuctionLite, get = "GetFixedBuyoutUndercut", set = "SetFixedBuyoutUndercut", }, vendorMultiplier = { type = "range", desc = L["Amount to multiply by vendor price to get default sell price."], name = L["Vendor Multiplier"], min = 0, max = 100, step = 0.5, order = 5, }, roundPrices = { type = "range", desc = L["Round all prices to this granularity, or zero to disable (0-1)."], name = L["Round Prices"], min = 0, max = 1, step = 0.01, order = 6, }, defaultStacks = { type = "select", desc = L["Number of stacks suggested when an item is first placed in the \"Sell\" tab."], name = L["Default Number of Stacks"], style = "dropdown", values = { a_one = L["One Stack"], b_full = L["Max Stacks"], c_excess = L["Max Stacks + Excess"], }, order = 7, }, defaultSize = { type = "select", desc = L["Stack size suggested when an item is first placed in the \"Sell\" tab."], name = L["Default Stack Size"], style = "dropdown", values = { a_one = L["One Item"], b_stack = L["Selected Stack Size"], c_full = L["Full Stack"], }, order = 8, }, printPriceData = { type = "toggle", desc = L["Print detailed price data when selling an item."], name = L["Print Detailed Price Data"], width = "double", order = 9, }, }, }; local YesNoMaybe = { a_yes = L["Always"], b_maybe = L["If Applicable"], c_no = L["Never"], }; local TooltipLocations = { a_cursor = L["Mouse Cursor"], b_right = L["Right Side of AH"], c_below = L["Below AH"], d_corner = L["Window Corner"], e_hide = L["Hide Tooltips"], }; local TooltipOptions = { type = "group", get = function(item) return AuctionLite.db.profile[item[#item]] end, set = function(item, value) AuctionLite.db.profile[item[#item]] = value end, args = { showVendor = { type = "select", desc = L["Show vendor sell price in tooltips."], name = L["Show Vendor Price"], style = "dropdown", values = YesNoMaybe, order = 1, }, blankVendor = { type = "description", name = "", desc = "", order = 2, }, showDisenchant = { type = "select", desc = L["Show expected disenchant value in tooltips."], name = L["Show Disenchant Value"], style = "dropdown", values = YesNoMaybe, order = 3, }, blankDisenchant = { type = "description", name = "", desc = "", order = 4, }, showAuction = { type = "select", desc = L["Show auction house value in tooltips."], name = L["Show Auction Value"], style = "dropdown", values = YesNoMaybe, order = 5, }, blankAuction = { type = "description", name = "", desc = "", order = 6, }, tooltipLocation = { type = "select", desc = L["Placement of tooltips in \"Buy\" and \"Sell\" tabs."], name = L["Tooltip Location"], style = "dropdown", values = TooltipLocations, order = 7, }, blankLocation = { type = "description", name = "", desc = "", order = 8, }, blank = { type = "description", name = " ", desc = " ", order = 9, }, coinTooltips = { type = "toggle", desc = L["Uses the standard gold/silver/copper icons in tooltips."], name = L["Use Coin Icons in Tooltips"], width = "double", order = 10, }, showStackPrice = { type = "toggle", desc = L["Show full stack prices in tooltips (shift toggles on the fly)."], name = L["Show Full Stack Price"], width = "double", order = 11, }, }, }; local FavoritesOptions = { type = "group", handler = AuctionLite, args = { selectlist = { name = L["Select a Favorites List"], desc = L["Choose a favorites list to edit."], type = "select", get = "GetCurrentList", set = "SetCurrentList", values = "GetLists", order = 12, }, newlist = { name = L["New..."], desc = L["Create a new favorites list."], type = "execute", func = "NewList", width = "half", order = 15, }, deletelist = { name = L["Delete"], desc = L["Delete the selected favorites list."], type = "execute", func = "DeleteList", width = "half", order = 20, }, additem = { name = L["Add an Item"], desc = L["Add a new item to a favorites list by entering the name here."], type = "input", order = 30, get = false, set = "AddListItem", width = "double", }, selectitem = { name = "", desc = "", type = "multiselect", order = 40, get = "GetCurrentListItems", set = "SetCurrentListItems", values = "GetListItems", control = "ListBox", width = "double", }, removeitems = { name = L["Remove Items"], desc = L["Remove the selected items from the current favorites list."], type = "execute", func = "RemoveListItems", order = 50, } }, }; local SlashOptions = { type = "group", handler = AuctionLite, args = { config = { type = "execute", desc = L["Open configuration dialog"], name = L["Configure"], func = function() InterfaceOptionsFrame_OpenToCategory(AuctionLite.optionFrames.tooltips); InterfaceOptionsFrame_OpenToCategory(AuctionLite.optionFrames.main); end, }, }, }; local SlashCmds = { "al", "auctionlite", }; local Defaults = { factionrealm = { prices = {}, prefs = {}, }, profile = { method = 1, duration = 3, bidUndercut = 0.25, buyoutUndercut = 0.02, bidUndercutFixed = 0, buyoutUndercutFixed = 0, vendorMultiplier = 3, roundPrices = 0.05, minProfit = 10, minDiscount = 0.25, getAll = false, countMyListings = true, openBags = false, considerResale = false, defaultStacks = "a_one", defaultSize = "b_stack", printPriceData = false, showVendor = "a_yes", showAuction = "b_maybe", showDisenchant = "b_maybe", tooltipLocation = "a_cursor", coinTooltips = true, showStackPrice = true, storePrices = true, startTab = "a_default", lastTab = 1, fastScanAd = false, showGreeting = false, favorites = { [L["Favorites"]] = {} }, }, }; ------------------------------------------------------------------------------- -- Handlers for favorites config screen ------------------------------------------------------------------------------- -- Store the favorites list being edited and the selected items in that list. local CurrentList = nil; local SelectedItems = {}; local IndexKeys = {}; local ResetFocus = false; -- Return the current favorites list. function AuctionLite:GetCurrentList() return CurrentList; end -- Set the current favorites list. function AuctionLite:SetCurrentList(info, list) if CurrentList ~= list then CurrentList = list; SelectedItems = {}; ResetFocus = true; end end -- Get the list of favorites lists. function AuctionLite:GetLists() local lists = {}; for name, _ in pairs(self.db.profile.favorites) do lists[name] = name; if CurrentList == nil then CurrentList = name; SelectedItems = {}; end end return lists; end -- Prompt for a name for a new favorites list. StaticPopupDialogs["AL_NEW_FAVORITES_LIST"] = { text = L["Enter the name of the new favorites list:"], button1 = L["Accept"], button2 = L["Cancel"], OnAccept = function(self) local name = self.editBox:GetText(); AuctionLite:CreateList(name); end, EditBoxOnEnterPressed = function(self) local name = self:GetText(); AuctionLite:CreateList(name); self:GetParent():Hide(); end, OnShow = function(self) self.editBox:SetFocus(); end, OnHide = function(self) self.editBox:SetText(""); end, hasEditBox = 1, timeout = 0, exclusive = 1, hideOnEscape = 1, preferredIndex = 3 }; -- Create a favorites list with a given name. function AuctionLite:CreateList(name) local favorites = self.db.profile.favorites; if favorites[name] == nil then favorites[name] = {}; CurrentList = name; SelectedItems = {}; ResetFocus = true; InterfaceOptionsFrame_OpenToCategory(self.optionFrames.favs); end end -- Request a name for a new favorites list. function AuctionLite:NewList() StaticPopup_Show("AL_NEW_FAVORITES_LIST"); end -- Delete a favorites list. function AuctionLite:DeleteList() if CurrentList ~= nil then self.db.profile.favorites[CurrentList] = nil; -- Find a new current list. CurrentList = nil; for name, _ in pairs(self.db.profile.favorites) do CurrentList = name; break; end -- If none exists, make an empty one. if CurrentList == nil then CurrentList = L["Favorites"]; self.db.profile.favorites[CurrentList] = {}; end SelectedItems = {}; end end -- Add an item to a favorites list. function AuctionLite:AddListItem(info, value) if CurrentList ~= nil and value ~= "" then local items = self.db.profile.favorites[CurrentList]; -- Did we get a link or a name? local link; local name = self:SplitLink(value); if name ~= nil then link = value; else name = value; link = nil; end name = strlower(name); -- Search for the item in the current list. local found = false; for item, _ in pairs(items) do if self:IsLink(item) then -- It's a link. If it's a match, we're done; no need to make changes. if strlower(self:SplitLink(item)) == name then found = true; break; end else -- It's a name. If it's a match, remove it so we can add a new entry -- later, either with a link or with the new capitalization. if strlower(item) == name then items[item] = nil; end end end -- If we didn't find the item (or if we removed the old one), add it. if not found then if link ~= nil then items[link] = true; else items[value] = true; end end ResetFocus = true; end end -- Indicate whether an item is selected. function AuctionLite:GetCurrentListItems(info, key) return SelectedItems[key]; end -- Select or deselect an item. function AuctionLite:SetCurrentListItems(info, key, value) if not value then value = nil; end SelectedItems[key] = value; end -- Get the contents of a favorites list. function AuctionLite:GetListItems() local result = {}; if CurrentList ~= nil then local items = self.db.profile.favorites[CurrentList]; if items ~= nil then local keys = {}; for item, _ in pairs(items) do local name, color = self:SplitLink(item); if name == nil or color == nil then name = item; color = "ffffffff"; end local display = "|c" .. color .. name .. "|r"; table.insert(result, display); keys[display] = item; end table.sort(result); IndexKeys = {}; for index, display in ipairs(result) do IndexKeys[index] = keys[display]; end end -- Massive hack: Move the focus to the "Add an Item" box. This needs -- to be done whenever we get a list of items because AceConfig -- rebuilds the entire panel on every event. if ResetFocus then ResetFocus = false; local i = 1; while true do local editBox = _G["AceGUI-3.0EditBox" .. i]; if editBox == nil then break; elseif editBox.obj:GetUserDataTable().options == FavoritesOptions then editBox:SetFocus(); break; end i = i + 1; end end end return result; end -- Remove a set of items from a favorites list. function AuctionLite:RemoveListItems() if CurrentList ~= nil then local items = self.db.profile.favorites[CurrentList]; if items ~= nil then for index, _ in pairs(SelectedItems) do items[IndexKeys[index]] = nil; end end SelectedItems = {}; end end ------------------------------------------------------------------------------- -- Handlers for fixed undercuts ------------------------------------------------------------------------------- -- Get the current fixed bid undercut. function AuctionLite:GetFixedBidUndercut() return self:PrintMoney(self.db.profile.bidUndercutFixed); end -- Get the current fixed buyout undercut. function AuctionLite:GetFixedBuyoutUndercut() return self:PrintMoney(self.db.profile.buyoutUndercutFixed); end -- Set the fixed bid undercut. function AuctionLite:SetFixedBidUndercut(info, value) self.db.profile.bidUndercutFixed = self:ParseMoney(value); end -- Set the fixed buyout undercut. function AuctionLite:SetFixedBuyoutUndercut(info, value) self.db.profile.buyoutUndercutFixed = self:ParseMoney(value); end ------------------------------------------------------------------------------- -- Initialization code ------------------------------------------------------------------------------- -- If we see an Ace2 database, convert it to Ace3. function AuctionLite:ConvertDB() local db = _G[DBName]; -- It's Ace2 if it uses "realms" instead of "factionrealm". if db ~= nil and db.realms ~= nil and db.factionrealm == nil then -- Change "Realm - Faction" keys to "Faction - Realm" keys. db.factionrealm = {} for k, v in pairs(db.realms) do db.factionrealm[k:gsub("(.*) %- (.*)", "%2 - %1")] = v; end -- Now unlink the old DB. db.realms = nil; end end -- Load our settings database. function AuctionLite:LoadDB() self.db = LibStub("AceDB-3.0"):New(DBName, Defaults, "Default"); end -- If any of the options are outdated, convert them. function AuctionLite:ConvertOptions() for _, profile in pairs(self.db.profiles) do -- Convert tooltip options. if type(profile.showAuction) == "boolean" then if profile.showAuction then profile.showAuction = "b_maybe"; else profile.showAuction = "c_no"; end end if type(profile.showVendor) == "boolean" then if profile.showVendor then profile.showVendor = "a_yes"; else profile.showVendor = "c_no"; end end if profile.tooltipLocation == "b_corner" then profile.tooltipLocation = "d_corner"; elseif profile.tooltipLocation == "c_hide" then profile.tooltipLocation = "e_hide"; end -- Convert favorites. if profile.favorites ~= nil then local value = true; for _, v in pairs(profile.favorites) do value = v; break; end if type(value) == "boolean" then profile.favorites = { [L["Favorites"]] = profile.favorites }; end end end end -- Set up all the config screens. function AuctionLite:InitConfig() local profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db); local config = LibStub("AceConfig-3.0"); config:RegisterOptionsTable("AuctionLite", SlashOptions, SlashCmds); local registry = LibStub("AceConfigRegistry-3.0"); registry:RegisterOptionsTable("AuctionLite Options", Options); registry:RegisterOptionsTable("AuctionLite Buy", BuyOptions); registry:RegisterOptionsTable("AuctionLite Sell", SellOptions); registry:RegisterOptionsTable("AuctionLite Tooltips", TooltipOptions); registry:RegisterOptionsTable("AuctionLite Favorites", FavoritesOptions); registry:RegisterOptionsTable("AuctionLite Profiles", profiles); local dialog = LibStub("AceConfigDialog-3.0"); self.optionFrames = { main = dialog:AddToBlizOptions("AuctionLite Options", L["AuctionLite"]), buy = dialog:AddToBlizOptions("AuctionLite Buy", L["Buy Tab"], L["AuctionLite"]); sell = dialog:AddToBlizOptions("AuctionLite Sell", L["Sell Tab"], L["AuctionLite"]); tooltips = dialog:AddToBlizOptions("AuctionLite Tooltips", L["Tooltips"], L["AuctionLite"]); favs = dialog:AddToBlizOptions("AuctionLite Favorites", L["Favorites"], L["AuctionLite"]); profiles = dialog:AddToBlizOptions("AuctionLite Profiles", L["Profiles"], L["AuctionLite"]); }; end