AuctioneerSuite/BeanCounter/MatchBeanCount.lua
2026-04-13 17:48:13 -04:00

233 lines
9.8 KiB
Lua

--[[
Auctioneer - BeanCounter Matcher module
Version: 5.9.4961 (WhackyWallaby)
Revision: $Id: MatchBeanCount.lua 4840 2010-08-04 21:44:00Z Nechckn $
URL: http://auctioneeraddon.com/
This is an Auctioneer Matcher module which will modify the Appraiser
price, based on past successes and failures as recorded by
BeanCounter. As an items sells successfully, this matcher will slowly
raise the price for future auctions; as your auctions expire without
selling, the price will slowly drop.
License:
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program(see GPL.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Note:
This AddOn's source code is specifically designed to work with
World of Warcraft's interpreted AddOn system.
You have an implicit license to use this AddOn with these facilities
since that is its designated purpose as per:
http://www.fsf.org/licensing/licenses/gpl-faq.html#InterpreterIncompat
--]]
--if not BeanCounter then
-- AucAdvanced.Print("BeanCounter not loaded")
-- return
--end
LibStub("LibRevision"):Set("$URL: http://svn.norganna.org/auctioneer/branches/5.9/BeanCounter/MatchBeanCount.lua $","$Rev: 4840 $","5.1.DEV.", 'auctioneer', 'libs')
if not AucAdvanced then return end
local libType, libName = "Match", "BeanCount"
local lib,parent,private = AucAdvanced.NewModule(libType, libName)
if not lib then return end
local print,decode,_,_,replicate,empty,get,set,default,debugPrint,fill = AucAdvanced.GetModuleLocals()
function lib.Processor(callbackType, ...)
if (callbackType == "tooltip") then
--Called when the tooltip is being drawn.
private.ProcessTooltip(...)
elseif (callbackType == "config") then
--Called when you should build your Configator tab.
private.SetupConfigGui(...)
elseif (callbackType == "listupdate") then
--Called when the AH Browse screen receives an update.
elseif (callbackType == "configchanged") then
--Called when your config options (if Configator) have been changed.
lib.ClearMatchArrayCache()
elseif callbackType == "scanstats" then
-- AH has been scanned
lib.ClearMatchArrayCache()
elseif callbackType == "auctionclose" then
lib.ClearMatchArrayCache() -- this is mostly to conserve RAM, we don't really need to wipe the cache here
end
end
lib.Processors = {}
function lib.Processors.tooltip(callbackType, ...)
--Called when the tooltip is being drawn.
private.ProcessTooltip(...)
end
function lib.Processors.config(callbackType, ...)
--Called when you should build your Configator tab.
private.SetupConfigGui(...)
end
function lib.Processors.configchanged(callbackType, ...)
--Called when your config options (if Configator) have been changed.
lib.ClearMatchArrayCache()
end
function lib.Processors.scanstats(callbackType, ...)
-- AH has been scanned
lib.ClearMatchArrayCache()
end
function lib.Processors.auctionclose(callbackType, ...)
lib.ClearMatchArrayCache() -- this is mostly to conserve RAM, we don't really need to wipe the cache here
end
local frame = CreateFrame("Frame", "MatchBeanCountHelperFrame")
frame:Hide()
frame:SetScript("OnEvent", function()
lib.ClearMatchArrayCache()
end)
frame:RegisterEvent("MAIL_CLOSED")
local matchArrayCache = {}
function lib.ClearMatchArrayCache() -- called from processor
if next(matchArrayCache) then
matchArrayCache = {}
end
end
function lib.GetMatchArray(hyperlink, marketprice, serverKey)
if not AucAdvanced.Settings.GetSetting("match.beancount.enable") or not BeanCounter or not BeanCounter.API.isLoaded then --check setting is on, beancounter exists, and that the database is sound
return
end
local linkType,itemId,property,factor = AucAdvanced.DecodeLink(hyperlink)
if (linkType ~= "item") then return end
local cacheKey = itemId .."x".. property .. "x" .. factor .. "x" .. marketprice
if matchArrayCache[cacheKey] then return matchArrayCache[cacheKey] end
local matchArray = {}
local marketdiff = 0
local competing = 0
if not marketprice then marketprice = 0 end
local matchprice = marketprice
local increase = AucAdvanced.Settings.GetSetting("match.beancount.success")
local decrease = AucAdvanced.Settings.GetSetting("match.beancount.failed")
local maxincrease = AucAdvanced.Settings.GetSetting("match.beancount.maxup")
local maxdecrease = AucAdvanced.Settings.GetSetting("match.beancount.maxdown")
local daterange = AucAdvanced.Settings.GetSetting("match.beancount.daterange")
--local matchstacksize = AucAdvanced.Settings.GetSetting("match.beancount.matchstacksize") --REMOVED for now, the posible issues arising from buying at last appraiser stack price needs to be resolved
local numdays = AucAdvanced.Settings.GetSetting("match.beancount.numdays")
--nil numdays if we dont care how far back our data goes
if not daterange then
numdays = nil
end
increase = (increase / 100) + 1
decrease = (decrease / 100) + 1
local player = UnitName("player")
local success, failed = BeanCounter.API.getAHSoldFailed(player, hyperlink, numdays, serverKey)
increase = math.pow(increase, math.pow(success, 0.8))
decrease = math.pow(decrease, math.pow(failed, 0.8))
matchprice = matchprice * increase
matchprice = matchprice * decrease
if (marketprice > 0) then
if (matchprice > (marketprice * (maxincrease*0.01))) then
matchprice = (marketprice * (maxincrease*0.01))
elseif (matchprice < (marketprice * (maxdecrease*0.01))) then
matchprice = (marketprice * (maxdecrease*0.01))
end
marketdiff = (((matchprice - marketprice)/marketprice)*100)
if (marketdiff-floor(marketdiff))<0.5 then
marketdiff = floor(marketdiff)
else
marketdiff = ceil(marketdiff)
end
else
marketdiff = 0
end
matchArray.value = matchprice
matchArray.diff = marketdiff
matchArray.returnstring = "BeanCount: % change: "..tostring(marketdiff)
if AucAdvanced.Settings.GetSetting("match.beancount.showhistory") then
matchArray.returnstring = "BeanCount: Succeeded: "..tostring(success).."\nBeanCount: Failed: "..tostring(failed).."\n"..matchArray.returnstring
end
matchArrayCache[cacheKey] = matchArray
return matchArray
end
local array = {}
function private.ProcessTooltip(frame, name, hyperlink, quality, quantity, cost, additional)
end
--function lib.OnLoad()
--This function is called when your variables have been loaded.
--You should also set your Configator defaults here
print("AucAdvanced: {{"..libType..":"..libName.."}} loaded!")
AucAdvanced.Settings.SetDefault("match.beancount.enable", false)
AucAdvanced.Settings.SetDefault("match.beancount.daterange", false)
--AucAdvanced.Settings.SetDefault("match.beancount.matchstacksize", false)
AucAdvanced.Settings.SetDefault("match.beancount.numdays", 30)
AucAdvanced.Settings.SetDefault("match.beancount.failed", -0.1)
AucAdvanced.Settings.SetDefault("match.beancount.success", 0.1)
AucAdvanced.Settings.SetDefault("match.beancount.maxup", 150)
AucAdvanced.Settings.SetDefault("match.beancount.maxdown", 50)
AucAdvanced.Settings.SetDefault("match.beancount.showhistory", true)
--end
--[[ Local functions ]]--
function private.SetupConfigGui(gui)
-- The defaults for the following settings are set in the lib.OnLoad function
local id = gui:AddTab(libName, libType.." Modules")
--gui:MakeScrollable(id)
gui:AddHelp(id, "what beancount module",
"What is this BeanCount module?",
"The BeanCount module uses BeanCounter's data to adjust the price based on the item's past selling history.")
gui:AddControl(id, "Header", 0, libName.." options")
gui:AddControl(id, "Subhead", 0, "Price Adjustments")
gui:AddControl(id, "Checkbox", 0, 1, "match.beancount.enable", "Enable Auc-Match-BeanCount")
gui:AddControl(id, "WideSlider", 0, 1, "match.beancount.failed", -20, 0, 0.1, "Auction failure markdown: %g%%")
gui:AddTip(id, "This controls how much you want to markdown an auction for every time it has failed to sell.\n"..
"This is cumulative. ie a setting of 10% with two failures will set the price at 81% of market")
gui:AddControl(id, "WideSlider", 0, 1, "match.beancount.success", 0, 20, 0.1, "Auction success markup: %g%%")
gui:AddTip(id, "This controls how much you want to markup an auction for every time it has sold.\n"..
"This is cumulative. ie a setting of 10% with two successes will set the price at 121% of market")
gui:AddControl(id, "WideSlider", 0, 1, "match.beancount.maxup", 101, 300, 1, "Maximum: %g%%")
gui:AddTip(id, "Sets the maximum that you are willing to set the price at, as a % of baseline")
gui:AddControl(id, "WideSlider", 0, 1, "match.beancount.maxdown", 1, 99, 1, "Minimum: %g%%")
gui:AddTip(id, "Sets the minimum that you are willing to set the price at, as a % of baseline")
gui:AddControl(id, "Checkbox", 0, 1, "match.beancount.showhistory", "Show history of successes and failures")
gui:AddTip(id, "This will add the number of successes and failures for that item to Appraiser's right-hand panel")
gui:AddControl(id, "Checkbox", 0, 1, "match.beancount.daterange", "Only use recent data")
gui:AddTip(id, "Only use data from the last x days, as set by the slider.")
gui:AddControl(id, "WideSlider", 0, 2, "match.beancount.numdays", 1, 300, 1, "Use data from last %g days")
gui:AddTip(id, "Only use data from the last x days, as set by the slider.")
--gui:AddControl(id, "Checkbox", 0, 1, "match.beancount.matchstacksize", "Seprerate data by stack size. Only available if Use recent data is set")
--gui:AddTip(id, "Only use data for the current stack size.")
end