233 lines
9.8 KiB
Lua
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
|