AuctioneerSuite/Auc-Advanced/Modules/Auc-Util-AutoMagic/Auc-Util-AutoMagic.lua
2026-04-13 17:48:13 -04:00

749 lines
32 KiB
Lua

--[[
Auctioneer - AutoMagic Utility module
Version: 5.9.4961 (WhackyWallaby)
Revision: $Id: Auc-Util-AutoMagic.lua 4901 2010-10-05 16:44:24Z Nechckn $
URL: http://auctioneeraddon.com/
AutoMagic is an Auctioneer module which automates mundane tasks for you.
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 AucAdvanced then return end
--Set up our module with AADV
local libName, libType = "AutoMagic", "Util"
local lib,parent,private = AucAdvanced.NewModule(libType, libName)
if not lib then return end
local print,decode,_,_,replicate,empty,get,set,default,debugPrint,fill,_TRANS = AucAdvanced.GetModuleLocals()
--Start Module Code
local amBTMRule, itemName, itemID, _
function lib.GetName()
return libName
end
local autosellframe = CreateFrame("Frame", "autosellframe", UIParent); autosellframe:Hide()
local autoselldata = {}
local autosell = {}
local GetPrice = function() return 0,0 end --fake getPrice when Appraiser is not available
if AucAdvanced.Modules.Util.Appraiser then
GetPrice = AucAdvanced.Modules.Util.Appraiser.GetPrice
end
lib.autoSellList = {} -- default empty table in case of no saved data
function lib.Processor(callbackType, ...)
if (callbackType == "tooltip") then lib.ProcessTooltip(...) --Called when the tooltip is being drawn.
elseif (callbackType == "config") then lib.SetupConfigGui(...) --Called when you should build your Configator tab.
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.
if (get("util.automagic.autosellgui")) then
lib.autoSellGUI()
set("util.automagic.autosellgui", false) -- Resetting our toggle switch
end
end
end
lib.Processors = {}
function lib.Processors.tooltip(callbackType, ...)
lib.ProcessTooltip(...) --Called when the tooltip is being drawn.
end
function lib.Processors.config(callbackType, ...)
lib.SetupConfigGui(...) --Called when you should build your Configator tab.
end
function lib.Processors.configchanged(callbackType, ...)
if (get("util.automagic.autosellgui")) then
lib.autoSellGUI()
set("util.automagic.autosellgui", false) -- Resetting our toggle switch
end
end
function lib.ProcessTooltip(tooltip, name, hyperlink, quality, quantity, cost, additional)
if not (get("util.automagic.depositTT")) then
if hyperlink then
local ttdepcost = GetDepositCost(hyperlink, get("util.automagic.deplength"), nil, quantity)
if (ttdepcost == nil) then
tooltip:AddLine("|cff336699 Unknown deposit cost |r")
elseif (ttdepcost == 0) then
tooltip:AddLine("|cff336699 No deposit cost |r")
else
tooltip:AddLine("|cffCCFF99"..get("util.automagic.deplength").."hr Deposit : |r" , ttdepcost)
end
end
end
end
local ahdeplength = {
{12, "12 hour"},
{24, "24 hour"},
{48, "48 hour"},
}
function lib.OnLoad()
lib.slidebar()
-- Read saved variables
lib.autoSellList = get("util.automagic.autoSellList") or lib.autoSellList -- will default to empty table if no saved variables
for id, name in pairs(lib.autoSellList) do
lib.ClientItemCacheRefresh("item:"..id)
end
-- Sets defaults
print("AucAdvanced: {{"..libType..":"..libName.."}} loaded!")
default("util.automagic.autovendor", false) -- DO NOT SET TRUE ALL AUTOMAGIC OPTIONS SHOULD BE TURNED ON MANUALLY BY END USER!!!!!!!
default("util.automagic.autostopafter12", true) --stops autovendor after 12 items are sold. Want it to be on
default("util.automagic.autosellgrey", false)
default("util.automagic.autocloseenable", false) -- Enables auto close of vendor window after autosale completion
default("util.automagic.showmailgui", false)
default("util.automagic.autosellgui", false) -- Acts as a button and reverts to false anyway
default("util.automagic.chatspam", true) --Supposed to default on has to be unchecked if you don't want the chat text.
default("util.automagic.depositTT", false) --Used for disabling the deposit costs TT
default("util.automagic.ammailguix", 100) --Used for storing mailgui location
default("util.automagic.ammailguiy", 100) --Used for storing mailgui location
default("util.automagic.uierrormsg", 0) --Keeps track of ui error msg's
default("util.automagic.deplength", 48)
default("util.automagic.overidebtmmail", false) -- Item AI for mail rule instead of BTM rule.
default("util.automagic.displaybeginerTooltips", true)
end
-- define what event fires what function
function lib.onEventDo(this, event)
if event == 'MERCHANT_SHOW' then lib.merchantShow() end
if event == 'MERCHANT_CLOSED' then lib.merchantClosed() end
if event == 'MAIL_SHOW' then lib.mailShow() end
if event == 'MAIL_CLOSED' then lib.mailClosed() end
if event == 'UI_ERROR_MESSAGE' then set("util.automagic.uierrormsg", 1) end
if event == 'BAG_UPDATE' then if lib.confirmsellui:IsVisible() then lib.vendorAction() end end --bags changed make sure vendor items are in order
end
--This will be used to sort our list's rather than the default scrollsheet method.
function lib.CustomSort(data, sort, width, column, dir)
assert(column <= width)
assert(dir == -1 or dir == 1)
table.sort(sort, function(a,b)
local aPos = (a-1)*width+column
local bPos = (b-1)*width+column
local dataA, dataB = data[aPos], data[bPos]
local colorA, nameA = string.match(dataA, "^|cff(%x+)|Hitem.+|h%[(.*)%]|h|r")
local colorB, nameB = string.match(dataB, "^|cff(%x+)|Hitem.+|h%[(.*)%]|h|r")
if colorA and nameA and colorB and nameB then --hyperlink check
dataA = colorA..nameA
dataB = colorB..nameB
end
if dir < 0 then
return (dataA > dataB) or (dataA == dataB and a > b)
end
return (dataA < dataB) or (dataA == dataB and a < b)
end)
end
function lib.SetupConfigGui(gui)
local id = gui:AddTab(libName)
gui:MakeScrollable(id)
--stores our ID id we use this to open the config button to correct frame
private.gui = gui
private.guiID = id
gui:AddHelp(id, "what is AutoMagic?",
_TRANS('AAMU_Help_WhatAutoMagic'), --"What is AutoMagic?"
_TRANS('AAMU_Help_WhatAutoMagicAnswer')) --"AutoMagic is a work-in-progress. Its goal is to automate tasks that auctioneers run into that can be a pain to do, as long as it is within the bounds set by Blizzard. \n\nAutoMagic currently will auto-sell any item bought via SearchUI for vendors, any item that is grey (if enabled) or any item on the auto-sell list. If enabled, when you open a merchant window you will see a listing of the items to sell."
gui:AddHelp(id, "AAMU: vendor options",
_TRANS('AAMU_Help_VendorOptions'), --"AAMU: Vendor Options"
_TRANS('AAMU_Help_VendorOptionsAnswer')) --"AutoMagic will sell items bought for vendoring to the vendor automatically. It also has the option of auto-selling all grey items or items on the custom sell list."
gui:AddHelp(id, "what is Mail GUI?",
_TRANS('AAMU_Help_WhatMailGUI'), --"What is the Mail GUI?"
_TRANS('AAMU_Help_WhatMailGUIAnswer')) --"This displays a window when the mailbox is opened that allows for the auto-loading of items into the send mail window based on purchase reasons from SearchUI. It can also use the ItemSuggest module reasons instead of the provided SearchUI reasons. Very handy for mass mailing items bought for a profession that another character has."
gui:AddControl(id, "Header", 0, libName.._TRANS('AAMU_Interface_GeneralOptions')) --" General Options"
gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.displaybeginerTooltips", _TRANS('AAMU_Interface_BeginnerTooltip')) --"Enable AutoMagic beginner tooltips"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_BeginnerTooltip')) --'Display the beginner tooltips on mouseover.'
gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.chatspam", _TRANS('AAMU_Interface_Chatspam')) --"Enable AutoMagic chat spam"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_Chatspam')) --'Display chat messages from AutoMagic.'
gui:AddControl(id, "Note", 0, 1, nil, nil, " ")
gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.depositTT", _TRANS('AAMU_Interface_DepositTooltip')) --"Disable deposit costs in the tooltip"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_DepositTooltip')) --'Remove item deposit costs from the tooltip.'
gui:AddControl(id, "Selectbox", 0, 1, ahdeplength, "util.automagic.deplength", _TRANS('AAMU_Interface_DepositLength')) --"Base deposits on what length of auction."
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_DepositLength')) --'Select the auction length deposit cost you want to display in the tooltip.'
gui:AddControl(id, "Header", 0, _TRANS('AAMU_Interface_VendorOptions')) --" Vendor Options"
gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.autovendor", _TRANS('AAMU_Interface_Vendoring')) --"Enable AutoMagic vendoring (W A R N I N G: READ HELP!) "
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_Vendoring')) --'Enable the auto-vendor options.'
gui:AddControl(id, "Checkbox", 0, 4, "util.automagic.autostopafter12", _TRANS('AAMU_Interface_AutoStop12')) --"Pause after selling 12 items."
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoStop12')) --'This allows you to buy back an accidental sale, since the server saves the last 12 sales to the vendor'
gui:AddControl(id, "Subhead", 0, "Which categories will be vendored?")
gui:AddControl(id, "Checkbox", 0, 4, "util.automagic.autosellgrey", _TRANS('AAMU_Interface_AutoSellGrey')) --"Auto-sell grey items quality items"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellGrey')) --'Auto-sell grey level items at the vendor.'
gui:AddControl(id, "Checkbox", 0, 6, "util.automagic.autosellgreynoprompt", _TRANS('AAMU_Interface_AutoNoPrompt')) --"...without confirmation prompt"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellGreyNoPrompt')) --'No confirmation window will be shown for vendoring grey (trash) items.'
gui:AddControl(id, "Checkbox", 0, 4, "util.automagic.autosellreason", _TRANS('AAMU_Interface_AutoSellReason')) --"Auto-sell items purchased using the vendor searcher"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellReason')) --'Auto-sell items purchased using the vendor searcher'
gui:AddControl(id, "Checkbox", 0, 6, "util.automagic.autosellreasonnoprompt", _TRANS('AAMU_Interface_AutoNoPrompt')) --"...without confirmation prompt"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellReasonNoPrompt')) --'No confirmation window will be shown for items with a purchased for vendor reason tag'
gui:AddControl(id, "Checkbox", 0, 4, "util.automagic.vendorunusablebop", _TRANS('AAMU_Interface_AutoSellBOP')) --"Auto-sell unusable soulbound gear"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellBOP')) --'Auto-sell unusable soulbound gear'
gui:AddControl(id, "Checkbox", 0, 6, "util.automagic.autosellbopnoprompt", _TRANS('AAMU_Interface_AutoNoPrompt')) --"...without confirmation prompt"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellBOPNoPrompt')) --'No confirmation window will be shown for selling soulbound items the players class cannot equip.'
gui:AddControl(id, "Checkbox", 0, 4, "util.automagic.autoselllist", _TRANS('AAMU_Interface_AutoSellListItems')) --"Auto-sell items on the always vendor list"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellListItems')) --'Auto-sell items on the always vendor list.'
gui:AddControl(id, "Checkbox", 0, 6, "util.automagic.autoselllistnoprompt", _TRANS('AAMU_Interface_AutoNoPrompt')) --"...without confirmation prompt"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellListNoPrompt')) --'No confirmation window will be shown for items on the always vendor list'
--gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.autoclosemerchant", "Auto Merchant Window Close(Power user feature READ HELP)")
gui:AddControl(id, "Note", 0, 1, nil, nil, " ")
gui:AddControl(id, "Button", 0, 1, "util.automagic.autosellgui", _TRANS('AAMU_Interface_AutoSellList')) --"Auto-Sell List"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_AutoSellList')) --'Check the box to view the Auto-Sell configuration GUI.'
gui:AddControl(id, "Header", 0, _TRANS('AAMU_Interface_GUIOptions')) --" GUI options"
gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.showmailgui", _TRANS('AAMU_Interface_MailGUI')) --"Enable Mail GUI for additional mail features"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_MailGUI')) --'Display the auto-mail window at the mail box.')
gui:AddControl(id, "Checkbox", 0, 1, "util.automagic.overidebtmmail", _TRANS('AAMU_Interface_OverrideSUIMail')) --"Use ItemSuggest values instead of SearchUI's reasons for Mail Loader"
gui:AddTip(id, _TRANS('AAMU_HelpTooltip_OverrideSUIMail')) --"Use the ItemSuggest reasons instead of the SearchUI 'Purchased for' reasons when sorting mail."
end
--Beginner Tooltips script display for all UI elements
function lib.buttonTooltips(self, text)
if get("util.automagic.displaybeginerTooltips") and text and self then
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
GameTooltip:SetText(text)
end
end
function lib.merchantShow()
private.eventframe:RegisterEvent("BAG_UPDATE")
if (get("util.automagic.autovendor")) then
--first lib.vendorAction call will sell all grays, bypassing promopt. Run lib.vendorAction to add anything remaining to the prompt window
if (get("util.automagic.autosellgreynoprompt")) then
lib.vendorAction(true)
end
lib.vendorAction()
--~ A better option is to auto close vendor when user hits confirm button window
--~ if (get("util.automagic.autoclosemerchant")) then
--~ if (get("util.automagic.chatspam")) then
--~ print("AutoMagic has closed the merchant window for you, to disable you must change this options in the settings.")
--~ end
--~ CloseMerchant()
--~ end
end
end
function lib.merchantClosed()
private.eventframe:UnregisterEvent("BAG_UPDATE")
if lib.confirmsellui:IsVisible() then lib.confirmsellui:Hide() end
end
function lib.mailShow()
if (get("util.automagic.showmailgui")) then
lib.mailGUI()
end
end
function lib.mailClosed() --Fires on mail box closed event & hides mailgui
local x,y = lib.ammailgui:GetCenter()
set("util.automagic.ammailguix" ,x)
set("util.automagic.ammailguiy" ,y)
lib.ammailgui:Hide()
end
function lib.mailGUI() --Function is called from lib.mailShow()
lib.makeMailGUI()
lib.ammailgui:Show()
end
function lib.autoSellGUI()
if (autosellframe:IsVisible()) then autosellframe:Hide() return end
autosellframe:Show()
lib.populateDataSheet()
end
function lib.closeAutoSellGUI()
autosellframe:Hide()
end
--Slidebar
function lib.autosellslidebar(_, button)
if (button == "LeftButton") then
lib.autoSellGUI()
else
--if we rightclick open the configuration window for the whole addon
if private.gui and private.gui:IsShown() then
AucAdvanced.Settings.Hide()
else
AucAdvanced.Settings.Show()
private.gui:ActivateTab(private.guiID)
end
end
end
local sideIcon
function lib.slidebar()
if LibStub then
--Need to figure out if we're embedded first
local embedded = false
for _, module in ipairs(AucAdvanced.EmbeddedModules) do
if module == "Auc-Util-AutoMagic" then
embedded = true
end
end
local sideIcon, sideIconE
if embedded then
sideIcon = "Interface\\AddOns\\Auc-Advanced\\Modules\\Auc-Util-AutoMagic\\Images\\amagicIcon"
sideIconE = "Interface\\AddOns\\Auc-Advanced\\Modules\\Auc-Util-AutoMagic\\Images\\amagicIconE"
else
sideIcon = "Interface\\AddOns\\Auc-Util-AutoMagic\\Images\\amagicIcon"
sideIconE = "Interface\\AddOns\\Auc-Util-AutoMagic\\Images\\amagicIconE"
end
local LibDataBroker = LibStub:GetLibrary("LibDataBroker-1.1", true)
if LibDataBroker then
private.LDBButton = LibDataBroker:NewDataObject("Auc-Util-AutoMagic", {
type = "launcher",
icon = sideIcon,
OnClick = function(self, button) lib.autosellslidebar(self, button) end,
})
function private.LDBButton:OnTooltipShow()
self:AddLine("AutoMagic: Auto-Sell Config", 1,1,0.5, 1)
self:AddLine("|cff1fb3ff".."Left-Click|r to open the 'Auto-Sell' list.", 1,1,0.5, 1)
self:AddLine("|cff1fb3ff".."Right-Click|r to edit the configuration.", 1,1,0.5, 1)
end
--we use a slight hack to LDB to animate our icon on Enter as well as tooltip display. The Tooltip will be hidden by slidebar but will show for other addons
function private.LDBButton:OnEnter()
if self.icon and type(self.icon) == "table" then
self.icon:SetTexture(sideIconE)
end
GameTooltip:SetOwner(self, "ANCHOR_NONE")
GameTooltip:SetPoint("TOPLEFT", self, "BOTTOMLEFT")
GameTooltip:ClearLines()
private.LDBButton.OnTooltipShow(GameTooltip)
GameTooltip:Show()
end
function private.LDBButton:OnLeave()
if self.icon and type(self.icon) == "table" then
self.icon:SetTexture(sideIcon)
end
GameTooltip:Hide()
end
end
end
end
local myworkingtable = {}
function lib.setWorkingItem(link)
if link == nil then return end
local name, _, _, _, _, _, _, _, _, texture = GetItemInfo(link)
local _, id, _, _, _, _ = decode(link)
autosellframe.workingname:SetText(name)
autosellframe.slot:SetTexture(texture)
myworkingtable = {}
for k, n in pairs(myworkingtable) do
myworkingtable[k] = nil
end
myworkingtable[id] = name
end
function autosellframe.removeitemfromlist()
for k, n in pairs(myworkingtable) do
lib.autoSellList[k] = nil
myworkingtable[k] = nil
end
set("util.automagic.autoSellList", lib.autoSellList)--Store the changed sell list across sessions
myworkingtable = {}
lib.populateDataSheet()
autosellframe.ClearIcon()
end
function autosellframe.additemtolist()
for k, n in pairs(myworkingtable) do
lib.autoSellList[k] = n
myworkingtable[k] = nil
end
set("util.automagic.autoSellList", lib.autoSellList)--Store the changed sell list across sessions
myworkingtable = {}
lib.populateDataSheet()
autosellframe.ClearIcon()
end
function autosellframe.ClearIcon()
autosellframe.workingname:SetText("Item Name")
autosellframe.slot:SetTexture("Interface\\Buttons\\UI-EmptySlot")
end
function autosellframe.IconClicked()
autosellframe.ClearIcon()
end
function lib.autoSellIconDrag()
local objtype, _, link = GetCursorInfo()
ClearCursor()
if objtype == "item" then
lib.setWorkingItem(link)
end
end
function lib.ClickLinkHook(_, link, button)
if link and autosellframe:IsShown() and link:find("Hitem:") then
if (button == "LeftButton") then
lib.setWorkingItem(link)
end
end
end
hooksecurefunc("ChatFrame_OnHyperlinkShow", lib.ClickLinkHook)
local autoselldata = {}; local bagcontents = {}; local bagcontentsnodups = {}
function lib.populateDataSheet()
for k, v in pairs(autoselldata) do autoselldata[k] = nil; end --Reset table to ensure fresh data.
for id, name in pairs(lib.autoSellList) do
if (id == nil) then return end
local _, itemLink, _, _, _, _, _, _, _, _ = GetItemInfo(id)
local abid, abuy, vendor
if itemLink then
abid,abuy = GetPrice(itemLink, nil, true)
vendor = GetSellValue and GetSellValue(id) or 0
else
itemLink = "|cffff0000"..name.."|r" -- item name in red
lib.ClientItemCacheRefresh("item:"..id)
abid, abuy, vendor = 0, 0, 0
end
table.insert(autoselldata,{
itemLink, --link form for mouseover tooltips to work
vendor,
tonumber(abuy) or tonumber(abid),
})
end
autosellframe.resultlist.sheet:SetData(autoselldata, style) --Set the GUI scrollsheet
for k, v in pairs(bagcontents) do bagcontents[k] = nil; end --Reset table to ensure fresh data.
for bag=0,4 do
for slot=1,GetContainerNumSlots(bag) do
if (GetContainerItemLink(bag,slot)) then
local itemLink = GetContainerItemLink(bag,slot)
if (itemLink == nil) then return end
local _, itemID, _, _, _, _ = decode(itemLink)
local btmRule = "~"
if BtmScan then
local _,itemCount = GetContainerItemInfo(bag,slot)
local reason, bids
local id, suffix, enchant, seed = BtmScan.BreakLink(itemLink)
local sig = ("%d:%d:%d"):format(id, suffix, enchant)
local bidlist = BtmScan.Settings.GetSetting("bid.list")
if (bidlist) then
bids = bidlist[sig..":"..seed.."x"..itemCount]
if(bids and bids[1]) then
btmRule = bids[1]
end
end
end
bagcontents[itemID] = btmRule
end
end
end
for k, v in pairs(bagcontentsnodups) do bagcontentsnodups[k] = nil; end --Reset 'data' table to ensure fresh data.
for id, btmRule in pairs(bagcontents) do
if (id == nil) then return end
local _, itemLink, _, _, _, _, _, _, _, _ = GetItemInfo(id)
local abid,abuy = GetPrice(itemLink, nil, true)
table.insert(bagcontentsnodups,{
itemLink, -- link form for mouseover tooltips to work
btmRule, --btm rule
tonumber(abuy) or tonumber(abid),
})
end
autosellframe.baglist.sheet:SetData(bagcontentsnodups, style) --Set the GUI scrollsheet
end
function autosell.OnBagListEnter(button, row, index)
if autosellframe.baglist.sheet.rows[row][index]:IsShown()then --Hide tooltip for hidden cells
local link
link = autosellframe.baglist.sheet.rows[row][index]:GetText()
if link:find("\124Hitem:%d") then
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
AucAdvanced.ShowItemLink(GameTooltip, link, 1)
end
end
end
function autosell.OnEnter(button, row, index)
if autosellframe.resultlist.sheet.rows[row][index]:IsShown()then --Hide tooltip for hidden cells
local link
link = autosellframe.resultlist.sheet.rows[row][index]:GetText()
if link:find("\124Hitem:%d") then
GameTooltip:SetOwner(button, "ANCHOR_RIGHT")
AucAdvanced.ShowItemLink(GameTooltip, link, 1)
end
end
end
function autosell.OnLeave(button, row, index)
GameTooltip:Hide()
end
function autosell.OnClickAutoSellSheet(button, row, index)
for index = 1, 3 do
local link = autosellframe.resultlist.sheet.rows[row][index]:GetText()
if link:find("\124Hitem:%d") then
lib.setWorkingItem(link)
return
end
end
lib.populateDataSheet()
end
function autosell.OnClickBagSheet(button, row, index)
for index = 1, 3 do
local link = autosellframe.baglist.sheet.rows[row][index]:GetText()
if link:find("\124Hitem:%d") then
lib.setWorkingItem(link)
return
end
end
lib.populateDataSheet()
end
function lib.makeautosellgui()
autosellframe:SetFrameStrata("HIGH")
autosellframe:SetBackdrop({
bgFile = "Interface/Tooltips/ChatBubble-Background",
edgeFile = "Interface/Tooltips/ChatBubble-BackDrop",
tile = true, tileSize = 32, edgeSize = 32,
insets = { left = 32, right = 32, top = 32, bottom = 32 }
})
autosellframe:SetBackdropColor(0,0,0, 1)
autosellframe:Hide()
autosellframe:SetPoint("CENTER", UIParent, "CENTER")
autosellframe:SetWidth(640)
autosellframe:SetHeight(450)
autosellframe:SetMovable(true)
autosellframe:EnableMouse(true)
autosellframe.Drag = CreateFrame("Button", nil, autosellframe)
autosellframe.Drag:SetPoint("TOPLEFT", autosellframe, "TOPLEFT", 10,-5)
autosellframe.Drag:SetPoint("TOPRIGHT", autosellframe, "TOPRIGHT", -10,-5)
autosellframe.Drag:SetHeight(6)
autosellframe.Drag:SetHighlightTexture("Interface\\FriendsFrame\\UI-FriendsFrame-HighlightBar")
autosellframe.Drag:SetScript("OnMouseDown", function() autosellframe:StartMoving() end)
autosellframe.Drag:SetScript("OnMouseUp", function() autosellframe:StopMovingOrSizing() end)
autosellframe.DragBottom = CreateFrame("Button",nil, autosellframe)
autosellframe.DragBottom:SetPoint("BOTTOMLEFT", autosellframe, "BOTTOMLEFT", 10,5)
autosellframe.DragBottom:SetPoint("BOTTOMRIGHT", autosellframe, "BOTTOMRIGHT", -10,5)
autosellframe.DragBottom:SetHeight(6)
autosellframe.DragBottom:SetHighlightTexture("Interface\\FriendsFrame\\UI-FriendsFrame-HighlightBar")
autosellframe.DragBottom:SetScript("OnMouseDown", function() autosellframe:StartMoving() end)
autosellframe.DragBottom:SetScript("OnMouseUp", function() autosellframe:StopMovingOrSizing() end)
local autoselltitle = autosellframe:CreateFontString(asuftitle, "OVERLAY", "GameFontNormalLarge")
autoselltitle:SetText("AutoMagic: Auto Sell Config")
autoselltitle:SetJustifyH("CENTER")
autoselltitle:SetWidth(300)
autoselltitle:SetHeight(10)
autoselltitle:SetPoint("TOPLEFT", autosellframe, "TOPLEFT", 0, -17)
autosellframe.autoselltitle = aautoselltitle
--Close Button
autosellframe.closeButton = CreateFrame("Button", nil, autosellframe, "OptionsButtonTemplate")
autosellframe.closeButton:SetPoint("BOTTOMRIGHT", autosellframe, "BOTTOMRIGHT", -530, 10)
autosellframe.closeButton:SetText(("Close"))
autosellframe.closeButton:SetScript("OnClick", lib.closeAutoSellGUI)
local SelectBox = LibStub:GetLibrary("SelectBox")
local ScrollSheet = LibStub:GetLibrary("ScrollSheet")
autosellframe.slot = autosellframe:CreateTexture(nil, "ARTWORK")
autosellframe.slot:SetPoint("TOPLEFT", autosellframe, "TOPLEFT", 23, -50)
autosellframe.slot:SetWidth(45)
autosellframe.slot:SetHeight(45)
autosellframe.slot:SetTexCoord(0.15, 0.85, 0.15, 0.85)
autosellframe.slot:SetTexture("Interface\\Buttons\\UI-EmptySlot")
autosellframe.icon = CreateFrame("Button", nil, autosellframe)
autosellframe.icon:SetPoint("TOPLEFT", autosellframe.slot, "TOPLEFT", 3, -3)
autosellframe.icon:SetWidth(38)
autosellframe.icon:SetHeight(38)
autosellframe.icon:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square.blp")
autosellframe.icon:SetScript("OnClick", autosellframe.IconClicked)
autosellframe.icon:SetScript("OnReceiveDrag", lib.autoSellIconDrag)
autosellframe.slot.help = autosellframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
autosellframe.slot.help:SetPoint("LEFT", autosellframe.slot, "RIGHT", 2, 7)
autosellframe.slot.help:SetText(("Drop item into box")) --"Drop item into box to search."
autosellframe.slot.help:SetWidth(100)
autosellframe.workingname = autosellframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
autosellframe.workingname:SetPoint("TOPLEFT", autosellframe, "TOPLEFT", 15, -100)
autosellframe.workingname:SetText((""))
autosellframe.workingname:SetWidth(90)
--Add Item to list button
autosellframe.additem = CreateFrame("Button", nil, autosellframe, "OptionsButtonTemplate")
autosellframe.additem:SetPoint("TOPLEFT", autosellframe, "TOPLEFT", 10, -150)
autosellframe.additem:SetText(('Add Item'))
autosellframe.additem:SetScript("OnClick", autosellframe.additemtolist)
autosellframe.additem.help = autosellframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
autosellframe.additem.help:SetPoint("TOPLEFT", autosellframe.additem, "TOPRIGHT", 1, 1)
autosellframe.additem.help:SetText(("(to Auto Sell list)"))
autosellframe.additem.help:SetWidth(90)
--Remove Item from list button
autosellframe.removeitem = CreateFrame("Button", nil, autosellframe, "OptionsButtonTemplate")
autosellframe.removeitem:SetPoint("TOPLEFT", autosellframe.additem, "BOTTOMLEFT", 0, -20)
autosellframe.removeitem:SetText(('Remove Item'))
autosellframe.removeitem:SetScript("OnClick", autosellframe.removeitemfromlist)
autosellframe.removeitem.help = autosellframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
autosellframe.removeitem.help:SetPoint("TOPLEFT", autosellframe.removeitem, "TOPRIGHT", 1, 1)
autosellframe.removeitem.help:SetText(("(from Auto Sell list)"))
autosellframe.removeitem.help:SetWidth(90)
--Create the autosell list results frame
autosellframe.resultlist = CreateFrame("Frame", nil, autosellframe)
autosellframe.resultlist:SetBackdrop({
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = true, tileSize = 32, edgeSize = 16,
insets = { left = 5, right = 5, top = 5, bottom = 5 }
})
autosellframe.resultlist:SetBackdropColor(0, 0, 0.0, 0.5)
autosellframe.resultlist:SetPoint("TOPLEFT", autosellframe, "BOTTOMLEFT", 270, 250)
autosellframe.resultlist:SetPoint("TOPRIGHT", autosellframe, "TOPLEFT",630, 0)
autosellframe.resultlist:SetPoint("BOTTOM", autosellframe, "BOTTOM", 0, 10)
autosellframe.resultlist.sheet = ScrollSheet:Create(autosellframe.resultlist, {
{ ('Auto Selling:'), "TOOLTIP", 170 },
{ "Vendor", "COIN", 70 },
{ "Appraiser", "COIN", 70 },
}, autosell.OnEnter, autosell.OnLeave, autosell.OnClickAutoSellSheet)
--use our custom sort method not scrollsheets
autosellframe.resultlist.sheet.CustomSort = lib.CustomSort
--Create the bag contents frame
autosellframe.baglist = CreateFrame("Frame", nil, autosellframe)
autosellframe.baglist:SetBackdrop({
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = true, tileSize = 32, edgeSize = 16,
insets = { left = 5, right = 5, top = 5, bottom = 5 }
})
autosellframe.baglist:SetBackdropColor(0, 0, 0.0, 0.5)
autosellframe.baglist:SetPoint("TOPLEFT", autosellframe, "BOTTOMLEFT", 270, 445)
autosellframe.baglist:SetPoint("TOPRIGHT", autosellframe, "TOPLEFT", 630, 0)
autosellframe.baglist:SetPoint("BOTTOM", autosellframe, "BOTTOM", 0, 250)
autosellframe.bagList = CreateFrame("Button", nil, autosellframe, "OptionsButtonTemplate")
autosellframe.bagList:SetPoint("TOPRIGHT", autosellframe.baglist, "BOTTOMRIGHT", -530, -50)
autosellframe.bagList:SetText(("Re-Scan Bags"))
autosellframe.bagList:SetScript("OnClick", lib.populateDataSheet)
autosellframe.baglist.sheet = ScrollSheet:Create(autosellframe.baglist, {
{ ('Bag Contents:'), "TOOLTIP", 170 },
{ ('BTM Rule'), "TEXT", 70 },
{ "Appraiser", "COIN", 70 },
}, autosell.OnBagListEnter, autosell.OnLeave, autosell.OnClickBagSheet)
--use our custom sort method not scrollsheets
autosellframe.baglist.sheet.CustomSort = lib.CustomSort
end
lib.makeautosellgui()
-- Client item cache refresh system
-- (Loosely based on similar code in Gatherer)
local tooltip = CreateFrame("GameTooltip")
local eventframe = CreateFrame("Frame") -- used for Events and for timer (via Update)
private.eventframe = eventframe
local timercounter = 0
local refreshlist
eventframe:SetScript("OnEvent", lib.onEventDo)
eventframe:RegisterEvent("MERCHANT_SHOW")
eventframe:RegisterEvent("MERCHANT_CLOSED")
eventframe:RegisterEvent("MAIL_SHOW")
eventframe:RegisterEvent("MAIL_CLOSED")
eventframe:RegisterEvent("UI_ERROR_MESSAGE")
local function timerOnUpdate(self, elapsed)
timercounter = timercounter - elapsed
if timercounter <= 0 then
if not refreshlist then -- this is a double-check - should not occur
eventframe:SetScript("OnUpdate", nil)
return
end
local link
repeat -- iterate refreshlist until we find an uncached item
link = next(refreshlist)
if not link then -- no more items in list - stop the timer
refreshlist = nil
eventframe:SetScript("OnUpdate", nil)
return
end
refreshlist[link] = nil
until not GetItemInfo(link)
tooltip:SetHyperlink(link) -- causes client to download item info from server into cache. todo: consider wrapping in pcall?
timercounter = 5 -- 5 seconds throttle between each server request
end
end
-- lib.ClientItemCacheRefresh
-- link : must be an item link which would work in both GetItemInfo and GameTooltip:SetHyperlink
-- note: the short form "item:<number>" is permissible
function lib.ClientItemCacheRefresh(link)
if not refreshlist then
refreshlist = {}
timercounter = 0 -- refresh on next update
eventframe:SetScript("OnUpdate", timerOnUpdate)
end
refreshlist[link] = true
end
AucAdvanced.RegisterRevision("$URL: http://svn.norganna.org/auctioneer/branches/5.9/Auc-Util-AutoMagic/Auc-Util-AutoMagic.lua $", "$Rev: 4901 $")