From 0864c596dcc8478a1d86fddcc1a9f1e9a3ad2f35 Mon Sep 17 00:00:00 2001 From: Manuel Simon Hirsig Date: Mon, 8 Aug 2016 07:51:31 +0200 Subject: [PATCH] bugfix and refactoring --- aux-addon.toc | 3 +- core.lua | 748 +++++++++++----------- core.xml | 19 - tables/auction_listing.lua | 2 +- tabs/auctions/core.lua | 10 +- tabs/auctions/frames.lua | 100 +-- tabs/bids/core.lua | 10 +- tabs/bids/frames.lua | 124 ++-- tabs/post/core.lua | 12 +- tabs/post/frames.lua | 644 +++++++++---------- tabs/search/core.lua | 13 +- tabs/search/frames.lua | 1245 ++++++++++++++++++------------------ 12 files changed, 1442 insertions(+), 1488 deletions(-) diff --git a/aux-addon.toc b/aux-addon.toc index 3b996dd..fa68def 100644 --- a/aux-addon.toc +++ b/aux-addon.toc @@ -4,11 +4,12 @@ ## SavedVariables: aux_datasets, aux_items, aux_item_ids, aux_auctionable_items, aux_merchant_buy, aux_merchant_sell, aux_characters, aux_recent_searches, aux_favorite_searches, aux_ignore_owner, aux_price_per_unit module.lua +init.lua core.xml +core.lua control.lua gui.lua - util\core.lua util\completion.lua util\persistence.lua diff --git a/core.lua b/core.lua index c8ffa92..3da37a9 100644 --- a/core.lua +++ b/core.lua @@ -1,6 +1,48 @@ -local addon = aux_module() -aux = tremove(addon, 1) -local m, public, private = unpack(addon) +local m, public, private = aux.module'aux' + +public.version = '3.8.0' + +public.bids_loaded = false +public.current_owner_page = nil +public.last_owner_page_requested = nil + +do + local mt = { + __newindex = function(self, name, method) + if strsub(name, 1, 2) == '__' then + self._metatable[name] = method + else + self._methods[name] = method + end + end, + __call = function(self, ...) + if self._metatable.__index then + setmetatable(self._methods, {__index=self._metatable.__index}) + self._metatable.__index = self._methods + end + + local object = setmetatable({}, self._metatable) + self._constructor(object, unpack(arg)) + return object + end, + } + function public.class(constructor) + return setmetatable({_constructor=constructor, _methods={}, _metatable={}}, mt) + end +end + +--public.dynamic_table = m.class(function(self, f) +-- self._f = f +--end) +--function m.dynamic_table:__newindex(key, value) +-- self._f()[key] = value +--end +--function m.dynamic_table:__index(key) +-- return self._f()[key] +--end +--function m.dynamic_table:__call() +-- return self._f() +--end do local mt = { @@ -33,77 +75,305 @@ do end end -private.modules = {} -function private.initialize_module(public_declarator) - public_declarator.LOAD = nil -end -m.initialize_module(public) -function public.module(name) - local public_interface, private_interface, public_declarator, private_declarator = unpack(aux_module()) - m.initialize_module(public_declarator) - tinsert(m.modules, public_interface) - public[name] = public_interface - return private_interface, public_declarator, private_declarator -end - private.tabs = {} -function public.tab(index, name) - local tab = {m.module(name)} - tab[2].ACTIVE = function() - return m[name] == m.active_tab() - end - for _, handler in {'OPEN', 'CLOSE', 'CLICK_LINK', 'PICKUP_ITEM', 'USE_ITEM'} do - tab[2][handler] = nil - end - m.tabs[index] = m[name] - return unpack(tab) +function public.tab(index, title, name) + local tab = {title=title, name=name, module={m.module(name)}} + tab.module[2].ACTIVE = function() + return tab == m.active_tab() + end + for _, handler in {'OPEN', 'CLOSE', 'CLICK_LINK', 'PICKUP_ITEM', 'USE_ITEM'} do + tab.module[3][handler] = nil + end + m.tabs[index] = tab + return unpack(tab.module) end do - local active_tab_index - private.active_tab = m.dynamic_table(function() - return m.tabs[active_tab_index] - end) - function private.on_tab_click(index) - if m.active_tab() then - m.active_tab().CLOSE() - end - active_tab_index = index - if m.active_tab() then - m.active_tab().OPEN() - end + local active_tab_index + private.active_tab = m.dynamic_table(function() + return m.tabs[active_tab_index] + end) + function private.on_tab_click(index) + if active_tab_index then + aux.call(m.active_tab.module[1].CLOSE) + end + active_tab_index = index + if active_tab_index then + aux.call(m.active_tab.module[1].OPEN) + end + end +end + +function public.VARIABLES_LOADED() + m.log('v'..m.version..' loaded.') + + aux.gui.set_window_style(AuxFrame) + tinsert(UISpecialFrames, 'AuxFrame') + + do + local tab_group = m.gui.tab_group(AuxFrame, 'DOWN') + for _, tab in m.tabs do + tab_group:create_tab(tab.title) + end + tab_group.on_select = m.on_tab_click + public.tab_group = tab_group + end + + do + local btn = m.gui.button(AuxFrame, 16) + btn:SetPoint('BOTTOMRIGHT', -6, 6) + btn:SetWidth(65) + btn:SetHeight(24) + btn:SetText('Close') + btn:SetScript('OnClick', m._(HideUIPanel, AuxFrame)) + public.close_button = btn + end + + do + local btn = m.gui.button(AuxFrame, 16) + btn:SetPoint('RIGHT', m.close_button, 'LEFT' , -5, 0) + btn:SetWidth(65) + btn:SetHeight(24) + btn:SetText('Default UI') + btn:SetScript('OnClick',function() + if AuctionFrame:IsVisible() then + HideUIPanel(AuctionFrame) + else + ShowUIPanel(AuctionFrame) + end + end) + end +end + +function private.AUCTION_HOUSE_SHOW() + if AuctionFrame:IsVisible() then + AuctionFrame:Hide() + end + AuxFrame:Show() + m.tab_group:set_tab(1) +end + +function private.AUCTION_HOUSE_CLOSED() + m.bids_loaded = false + m.current_owner_page = nil + m.post.stop() + m.stack.stop() + m.scan.abort() + m.tab_group:set_tab() + AuxFrame:Hide() +end + +function private.AUCTION_BIDDER_LIST_UPDATE() + m.bids_loaded = true +end + +function private.AUCTION_OWNED_LIST_UPDATE() + m.current_owner_page = m.last_owner_page_requested or 0 +end + +function m.ADDON_LOADED.Blizzard_AuctionUI() + AuctionFrame:UnregisterEvent('AUCTION_HOUSE_SHOW') + AuctionFrame:SetScript('OnHide', nil) + + m.hook('ShowUIPanel', function(...) + if arg[1] == AuctionFrame then + return AuctionFrame:Show() + end + return m.orig.ShowUIPanel(unpack(arg)) + end) + + m.hook('GetOwnerAuctionItems', m.GetOwnerAuctionItems) + m.hook('PickupContainerItem', m.PickupContainerItem) + m.hook('SetItemRef', m.SetItemRef) + m.hook('UseContainerItem', m.UseContainerItem) + m.hook('AuctionFrameAuctions_OnEvent', m.AuctionFrameAuctions_OnEvent) +end + +do + local function cost_label(cost) + local label = LIGHTYELLOW_FONT_COLOR_CODE..'(Total Cost: '..FONT_COLOR_CODE_CLOSE + label = label..(cost and m.util.format_money(cost, nil, LIGHTYELLOW_FONT_COLOR_CODE) or GRAY_FONT_COLOR_CODE..'---'..FONT_COLOR_CODE_CLOSE) + label = label..LIGHTYELLOW_FONT_COLOR_CODE..')'..FONT_COLOR_CODE_CLOSE + return label + end + + function m.ADDON_LOADED.Blizzard_CraftUI() + m.hook('CraftFrame_SetSelection', function(...) + local results = {m.orig.CraftFrame_SetSelection(unpack(arg)) } + + local id = GetCraftSelectionIndex() + local reagent_count = GetCraftNumReagents(id) + + local total_cost = 0 + for i=1,reagent_count do + local link = GetCraftReagentItemLink(id, i) + if not link then + total_cost = nil + break + end + local item_id, suffix_id = m.info.parse_hyperlink(link) + local count = ({GetCraftReagentInfo(id, i)})[3] + local _, price, limited = m.cache.merchant_info(item_id) + local value = price and not limited and price or m.history.value(item_id..':'..suffix_id) + if not value then + total_cost = nil + break + else + total_cost = total_cost + value * count + end + end + + CraftReagentLabel:SetText(SPELL_REAGENTS..' '..cost_label(total_cost)) + + return unpack(results) + end) + end + + function m.ADDON_LOADED.Blizzard_TradeSkillUI() + m.hook('TradeSkillFrame_SetSelection', function(...) + local results = {m.orig.TradeSkillFrame_SetSelection(unpack(arg)) } + + local id = GetTradeSkillSelectionIndex() + local reagent_count = GetTradeSkillNumReagents(id) + + local total_cost = 0 + for i=1,reagent_count do + local link = GetTradeSkillReagentItemLink(id, i) + if not link then + total_cost = nil + break + end + local item_id, suffix_id = m.info.parse_hyperlink(link) + local count = ({GetTradeSkillReagentInfo(id, i)})[3] + local _, price, limited = m.cache.merchant_info(item_id) + local value = price and not limited and price or m.history.value(item_id..':'..suffix_id) + if not value then + total_cost = nil + break + else + total_cost = total_cost + value * count + end + end + + TradeSkillReagentLabel:SetText(SPELL_REAGENTS..' '..cost_label(total_cost)) + + return unpack(results) + end) + end +end + +public.orig = {} +function public.hook(name, handler, object) + local orig + if object then + m.orig[object] = m.orig[object] or {} + orig = m.orig[object] + else + object = object or getfenv(0) + orig = m.orig + end + + if orig[name] then + error('"'..name..'" is already hooked.') + end + + orig[name] = object[name] + object[name] = handler +end + +function private.GetOwnerAuctionItems(...) + local page = arg[1] + m.last_owner_page_requested = page + return m.orig.GetOwnerAuctionItems(unpack(arg)) +end + +function private.AuctionFrameAuctions_OnEvent(...) + if AuctionFrameAuctions:IsVisible() then + return m.orig.AuctionFrameAuctions_OnEvent(unpack(arg)) + end +end + +function private.SetItemRef(...) + if arg[3] ~= 'RightButton' or not m.index(m.active_tab.module[1], 'CLICK_LINK') or not strfind(arg[1], '^item:%d+') then + return m.orig.SetItemRef(unpack(arg)) + end + local item_info = m.info.item(tonumber(({strfind(arg[1], '^item:(%d+)')})[3])) + if item_info then + return m.active_tab.module[1].CLICK_LINK(item_info) + end +end + +function private.PickupContainerItem(...) + if m.modified() or not m.index(m.active_tab.module[1], 'PICKUP_ITEM') then + return m.orig.PickupContainerItem(unpack(arg)) + end + local item_info = m.info.container_item(arg[1], arg[2]) + if item_info then + return m.active_tab.module[1].PICKUP_ITEM(item_info) + end +end + +function private.UseContainerItem(...) + if m.modified() or not m.index(m.active_tab.module[1], 'USE_ITEM') then + return m.orig.UseContainerItem(unpack(arg)) + end + local item_info = m.info.container_item(arg[1], arg[2]) + if item_info then + return m.active_tab.module[1].USE_ITEM(item_info) end end do - local x = 0 - function public.id() - x = x + 1 - return x + local locked + + function public.bid_in_progress() + return locked + end + + function public.place_bid(type, index, amount, on_success) + + if locked then + return + end + + local money = GetMoney() + PlaceAuctionBid(type, index, amount) + if money >= amount then + locked = true + + m.control.event_listener('CHAT_MSG_SYSTEM', function(kill) + if arg1 == ERR_AUCTION_BID_PLACED then + aux.call(on_success) + locked = false + kill() + end + end) + end end end do - local mt = { - __newindex = function(self, name, method) - if strsub(name, 1, 2) == '__' then - self._metatable[name] = method - else - self._methods[name] = method + local locked + + function public.cancel_in_progress() + return locked + end + + function public.cancel_auction(index, on_success) + + if locked then + return + end + + locked = true + + CancelAuction(index) + m.control.event_listener('CHAT_MSG_SYSTEM', function(kill) + if arg1 == ERR_AUCTION_REMOVED then + aux.call(on_success) + locked = false + kill() end - end, - __call = function(self, ...) - setmetatable(self._methods, self._metatable.__index) - self._metatable.__index =self._methods - local object = setmetatable({}, self._metatable) - for name, method in self._methods do - object[name] = method - end - self._constructor(object, unpack(arg)) - return object - end, - } - function public.class(constructor) - return setmetatable({_constructor=constructor, _methods={}, _metatable={}}, mt) + end) end end @@ -137,9 +407,9 @@ do end function public.call(f, ...) - if f then - return f(unpack(arg)) - end + if f then + return f(unpack(arg)) + end end function public.index(t, ...) @@ -151,309 +421,22 @@ function public.index(t, ...) return t end -function public.on_load() - public.version = '3.8.0' - public.bids_loaded = false - public.current_owner_page = nil - public.last_owner_page_requested = nil - private.auction_frame_loaded = nil - - m.log('aux v'..m.version..' loaded.') - - aux.gui.set_window_style(AuxFrame) - tinsert(UISpecialFrames, 'AuxFrame') - - do - local tab_group = m.gui.tab_group(AuxFrame, 'DOWN') - tab_group:create_tab('Search') - tab_group:create_tab('Post') - tab_group:create_tab('Auctions') - tab_group:create_tab('Bids') - tab_group.on_select = m.on_tab_click - public.tab_group = tab_group - end - - do - local btn = m.gui.button(AuxFrame, 16) - btn:SetPoint('BOTTOMRIGHT', -6, 6) - btn:SetWidth(65) - btn:SetHeight(24) - btn:SetText('Close') - btn:SetScript('OnClick', m._(HideUIPanel, AuxFrame)) - public.close_button = btn - end - - do - local btn = m.gui.button(AuxFrame, 16) - btn:SetPoint('RIGHT', m.close_button, 'LEFT' , -5, 0) - btn:SetWidth(65) - btn:SetHeight(24) - btn:SetText('Default UI') - btn:SetScript('OnClick',function() - if AuctionFrame:IsVisible() then - HideUIPanel(AuctionFrame) - else - ShowUIPanel(AuctionFrame) - end - end) - end - - for _, module in m.modules do - m.call(module.LOAD) - end -end - -function public.on_event() - if event == 'VARIABLES_LOADED' then - m.on_load() - elseif event == 'ADDON_LOADED' then - m.call(m.on_addon_load[arg1]) - elseif event == 'AUCTION_HOUSE_SHOW' then - m.on_auction_house_show() - elseif event == 'AUCTION_HOUSE_CLOSED' then - m.on_auction_house_closed() - m.bids_loaded = false - m.current_owner_page = nil - elseif event == 'AUCTION_BIDDER_LIST_UPDATE' then - m.bids_loaded = true - elseif event == 'AUCTION_OWNED_LIST_UPDATE' then - m.current_owner_page = m.last_owner_page_requested or 0 - end -end - -private.on_addon_load = {} -function m.on_addon_load.Blizzard_AuctionUI() - - AuctionFrame:UnregisterEvent('AUCTION_HOUSE_SHOW') - AuctionFrame:SetScript('OnHide', nil) - - m.hook('ShowUIPanel', function(...) - if arg[1] == AuctionFrame then - return AuctionFrame:Show() - end - return m.orig.ShowUIPanel(unpack(arg)) - end) - - m.hook('GetOwnerAuctionItems', m.GetOwnerAuctionItems) - m.hook('PickupContainerItem', m.PickupContainerItem) - m.hook('SetItemRef', m.SetItemRef) - m.hook('UseContainerItem', m.UseContainerItem) - m.hook('AuctionFrameAuctions_OnEvent', m.AuctionFrameAuctions_OnEvent) -end -do - local function cost_label(cost) - local label = LIGHTYELLOW_FONT_COLOR_CODE..'(Total Cost: '..FONT_COLOR_CODE_CLOSE - label = label..(cost and m.util.format_money(cost, nil, LIGHTYELLOW_FONT_COLOR_CODE) or GRAY_FONT_COLOR_CODE..'---'..FONT_COLOR_CODE_CLOSE) - label = label..LIGHTYELLOW_FONT_COLOR_CODE..')'..FONT_COLOR_CODE_CLOSE - return label - end - - function m.on_addon_load.Blizzard_CraftUI() - m.hook('CraftFrame_SetSelection', function(...) - local results = {m.orig.CraftFrame_SetSelection(unpack(arg)) } - - local id = GetCraftSelectionIndex() - local reagent_count = GetCraftNumReagents(id) - - local total_cost = 0 - for i=1,reagent_count do - local link = GetCraftReagentItemLink(id, i) - if not link then - total_cost = nil - break - end - local item_id, suffix_id = m.info.parse_hyperlink(link) - local count = ({GetCraftReagentInfo(id, i)})[3] - local _, price, limited = m.cache.merchant_info(item_id) - local value = price and not limited and price or m.history.value(item_id..':'..suffix_id) - if not value then - total_cost = nil - break - else - total_cost = total_cost + value * count - end - end - - CraftReagentLabel:SetText(SPELL_REAGENTS..' '..cost_label(total_cost)) - - return unpack(results) - end) - end - - function m.on_addon_load.Blizzard_TradeSkillUI() - m.hook('TradeSkillFrame_SetSelection', function(...) - local results = {m.orig.TradeSkillFrame_SetSelection(unpack(arg)) } - - local id = GetTradeSkillSelectionIndex() - local reagent_count = GetTradeSkillNumReagents(id) - - local total_cost = 0 - for i=1,reagent_count do - local link = GetTradeSkillReagentItemLink(id, i) - if not link then - total_cost = nil - break - end - local item_id, suffix_id = m.info.parse_hyperlink(link) - local count = ({GetTradeSkillReagentInfo(id, i)})[3] - local _, price, limited = m.cache.merchant_info(item_id) - local value = price and not limited and price or m.history.value(item_id..':'..suffix_id) - if not value then - total_cost = nil - break - else - total_cost = total_cost + value * count - end - end - - TradeSkillReagentLabel:SetText(SPELL_REAGENTS..' '..cost_label(total_cost)) - - return unpack(results) - end) - end -end +public.huge = 2^100000 do - local locked - - function public.bid_in_progress() - return locked - end - - function public.place_bid(type, index, amount, on_success) - - if locked then - return - end - - local money = GetMoney() - PlaceAuctionBid(type, index, amount) - if money >= amount then - locked = true - - m.control.event_listener('CHAT_MSG_SYSTEM', function(kill) - if arg1 == ERR_AUCTION_BID_PLACED then - aux.call(on_success) - locked = false - kill() - end - end) - end - end -end - -do - local locked - - function public.cancel_in_progress() - return locked - end - - function public.cancel_auction(index, on_success) - - if locked then - return - end - - locked = true - - CancelAuction(index) - m.control.event_listener('CHAT_MSG_SYSTEM', function(kill) - if arg1 == ERR_AUCTION_REMOVED then - aux.call(on_success) - locked = false - kill() - end - end) - end + local x = 0 + function public.id() + x = x + 1 + return x + end end function public.log(...) - local msg = '[aux]' - for i=1,arg.n do - msg = msg..' '..tostring(arg[i]) - end - DEFAULT_CHAT_FRAME:AddMessage(msg, 1, 1, 0) -end - -function private.GetOwnerAuctionItems(...) - local page = arg[1] - m.last_owner_page_requested = page - return m.orig.GetOwnerAuctionItems(unpack(arg)) -end - -function private.AuctionFrameAuctions_OnEvent(...) - if AuctionFrameAuctions:IsVisible() then - return m.orig.AuctionFrameAuctions_OnEvent(unpack(arg)) - end -end - -function public.neutral_faction() - return not UnitFactionGroup('npc') -end - -function private.on_auction_house_show() - if AuctionFrame:IsVisible() then - AuctionFrame:Hide() - end - AuxFrame:Show() - m.tab_group:set_tab(1) -end - -function private.on_auction_house_closed() - m.post.stop() - m.stack.stop() - m.scan.abort() - m.tab_group:set_tab() - AuxFrame:Hide() -end - -function public.min_bid_increment(current_bid) - return max(1, floor(current_bid / 100) * 5) -end - -function public.price_level_color(pct) - if pct > 135 then - return 1.0,0.0,0.0 -- red - elseif pct > 110 then - return 1.0,0.6,0.1 -- orange - elseif pct > 80 then - return 1.0,1.0,0.0 -- yellow - elseif pct > 50 then - return 0.1,1.0,0.1 -- green - else - return 0.2,0.6,1.0 -- blue - end -end - -function private.SetItemRef(...) - if not arg[3] == 'RightButton' or not m.active_tab.CLICK_LINK or not m.active_tab() or not strfind(arg[1], '^item:%d+') then - return m.orig.SetItemRef(unpack(arg)) + local msg = '[aux]' + for i=1,arg.n do + msg = msg..' '..tostring(arg[i]) end - local item_info = m.info.item(tonumber(({strfind(arg[1], '^item:(%d+)')})[3])) - if item_info then - return m.active_tab.CLICK_LINK(item_info) - end -end - -function private.PickupContainerItem(...) - if IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() or not m.active_tab() or not m.active_tab.PICKUP_ITEM then - return m.orig.PickupContainerItem(unpack(arg)) - end - local item_info = m.info.container_item(arg[1], arg[2]) - if item_info then - return m.active_tab.PICKUP_ITEM(item_info) - end -end - -function private.UseContainerItem(...) - if IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() or not m.active_tab() or not m.active_tab.USE_ITEM then - return m.orig.UseContainerItem(unpack(arg)) - end - local item_info = m.info.container_item(arg[1], arg[2]) - if item_info then - return m.active_tab.USE_ITEM(item_info) - end + DEFAULT_CHAT_FRAME:AddMessage(LIGHTYELLOW_FONT_COLOR_CODE..msg) end function public.is_player(name, current) @@ -461,29 +444,28 @@ function public.is_player(name, current) return not current and aux.index(aux_characters, realm, name) or UnitName('player') == name end -function public.unmodified() - return not IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() +function public.modified() + return IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() end -public.orig = {} -function public.hook(name, handler, object) - local orig - if object then - m.orig[object] = m.orig[object] or {} - orig = m.orig[object] - else - object = object or getfenv(0) - orig = m.orig - end - - if orig[name] then - error('"'..name..'" is already hooked.') - end - - orig[name] = object[name] - object[name] = handler +function public.neutral_faction() + return not UnitFactionGroup('npc') end -public.huge = 2^100000 +function public.min_bid_increment(current_bid) + return max(1, floor(current_bid / 100) * 5) +end -public.null = {} \ No newline at end of file +function public.price_level_color(pct) + if pct > 135 then + return 1.0,0.0,0.0 -- red + elseif pct > 110 then + return 1.0,0.6,0.1 -- orange + elseif pct > 80 then + return 1.0,1.0,0.0 -- yellow + elseif pct > 50 then + return 0.1,1.0,0.1 -- green + else + return 0.2,0.6,1.0 -- blue + end +end \ No newline at end of file diff --git a/core.xml b/core.xml index f53b1ac..97205c5 100644 --- a/core.xml +++ b/core.xml @@ -1,23 +1,4 @@ - -