init
This commit is contained in:
@@ -0,0 +1,193 @@
|
||||
v2.3.6
|
||||
*The subclass dropdown in the custom filter sidebar tab will now properly clear when the class dropdown is changed.
|
||||
*Removed code for the old TSM app which was increasing logout times.
|
||||
|
||||
v2.3.5
|
||||
*Fixed issue with calculating price per target item for gems in destroying search.
|
||||
*Added events and moduleAPIs for the new TSM Assistant feature.
|
||||
|
||||
v2.3.4
|
||||
*Fixed issue with calculating percentage of min buyout versus deValue.
|
||||
*Added min / max item level for other > disenchant search.
|
||||
*Fixed issue with destroying search scanning the entire AH.
|
||||
|
||||
v2.3.3
|
||||
*Fixed variable being declarded as global unnecessarily.
|
||||
*Fixed bug with Sniper not working for Shopping operations.
|
||||
*Fixed error when starting Sniper scans.
|
||||
|
||||
v2.3.2
|
||||
*Fixed issue with vendor and disenchant searches.
|
||||
|
||||
v2.3.1
|
||||
*No update. Trying to fix issue with curse.
|
||||
|
||||
v2.3
|
||||
*Added Sniper feature in the "Other" sidebar tab.
|
||||
*Added options for new Sniper feature to Shopping's options page.
|
||||
*Cleaned up a lot of older, deprecated code.
|
||||
*Updated localizations.
|
||||
|
||||
v2.2.4
|
||||
*Fixed bug in filter search code.
|
||||
|
||||
v2.2.3
|
||||
*Updated Shopping Appdata to support changes in desktop App v203.
|
||||
|
||||
v2.2.2
|
||||
*Fixed layout of buttons in the "Other" sidebar page.
|
||||
|
||||
v2.2.1
|
||||
*Updating group tree creation API call.
|
||||
|
||||
v2.2
|
||||
*Added disenchant search to the "Other" sidebar tab.
|
||||
*Added an option to set the max percentage of disenchant value that the disenchant search will return results for.
|
||||
|
||||
v2.1.1
|
||||
*Api changes for gathering shopping search
|
||||
|
||||
v2.1
|
||||
*Fixed bug on non-enUS clients.
|
||||
*Added Ink of Dreams / Shadow Pigment to applicable destroy mode searches.
|
||||
*Updated some API functions to support new gathering functionality in TSM_Crafting.
|
||||
*Added shopping operation max price to tooltips.
|
||||
*Added lesser essences to destroy searches for greater essences.
|
||||
*Fixed some destroy ratio issues.
|
||||
*Updated TOC for patch 5.4.
|
||||
|
||||
v2.0.4
|
||||
*Bug fix with v2.0.3 and TSM2.1.
|
||||
|
||||
v2.0.3
|
||||
*Fixed a bug involving switching AH tabs without ever opening the sidebar.
|
||||
*Moved operation management to its own tab.
|
||||
|
||||
v2.0.2
|
||||
*Fixed bug that was causing destroy searches from gathering to not work properly.
|
||||
*Updated scrolling tables.
|
||||
*The Bid percent option is now correctly a percent slider.
|
||||
|
||||
v2.0.1
|
||||
*Removed old dealfinding code.
|
||||
*Bug fix with the quick posting window.
|
||||
|
||||
v2.0
|
||||
*First 2.0 Version!
|
||||
\\
|
||||
|
||||
v1.4
|
||||
*Updated for patch 5.2.
|
||||
*Fixed some bugs with linking items into the search bar.
|
||||
*Added the "Quick Posting" window and corresponding options.
|
||||
*Added support for new quick buyout feature.
|
||||
*Fixed various battle pet issues.
|
||||
*Fixed an issue with quick posting auction duration.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v1.3
|
||||
*The search should now be smarter when selecting the next item to buy.
|
||||
*Moved the dealfinding search to the "special searches" frame.
|
||||
*Added code to take advantage of some of the new scan speedups in LibAuctionScan.
|
||||
*Added option for selecting price source of % market value column in search results table.
|
||||
*Fixed a bug with items in imported lists not getting names.
|
||||
*Updated for the new TSM design.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v1.2
|
||||
*Added special searches (currently Vendor and Disenchant).
|
||||
*Dramatically increased the speed at which Shopping can purchase items.
|
||||
*Added support for other modules being able to create shopping lists.
|
||||
*Items in shopping lists will now show in alphabetical order.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v1.1
|
||||
*Added an option for not showing results above max dealfinding price.
|
||||
*Added right-click shortcut to dealfinding/shopping lists in recent searches frame to open up options for that list.
|
||||
*Fixed a bug with the text at the top of the Crafting Mats search not being correct.
|
||||
*Fixed a bug where the Crafting Mats search could potentially buy too many mats.
|
||||
*The Crafting Mats frame will now properly update its color when changed in the TSM options.
|
||||
*The search bar will now properly lose focus when the TSM tab is in the background.
|
||||
*Fixed some bugs with the confirmation window's frame strata in various situations.
|
||||
*The search will no longer restart if an auction is not found.
|
||||
*When buying things, the next row will now be selected automatically.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v1.0
|
||||
*First Release Version!
|
||||
|
||||
|
||||
|
||||
**Beta Versions:**
|
||||
|
||||
v0.2.5
|
||||
*Updated TOC for patch 4.2.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.2.4
|
||||
*Updated the scanning code.
|
||||
*The scanning code should now work better with the new version of Auctioneer.
|
||||
*Added "Transforming" to what was previously the "Shopping - Milling / Prospecting / Disenchanting" feature.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.2.3
|
||||
*Adding items to dealfinding should now give an "invalid item" message far less frequently.
|
||||
*Fixed a bug with the disenchanting feature not properly integrating with the shopping - crafting mats feature.
|
||||
*Updated the TOC for patch 4.1.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.2.2
|
||||
*Fixed a bug with shopping for inks causing an error.
|
||||
*Implemented disenchanting scans. Currently only dusts are supported.
|
||||
*Added an option to not disenchant for crafting mats.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.2.1
|
||||
*Possibly fixed the bug where auctions were being skipped / ignored by Shopping.
|
||||
*Fixed a few typos.
|
||||
*Fixed a bug where setting a max price for general buying was throwing an error.
|
||||
*Added a "Skip Current Auction" button to Dealfinding.
|
||||
*Changed any use of "Dealfinder" to "Dealfinding" for consistency.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.2
|
||||
*Fixed some incorrect prospecting values.
|
||||
*Added an option to disable searching for ore when shopping for raw gems for Crafting.
|
||||
*Added "herbs / ore only" option for milling / prospecting searches.
|
||||
*Moved all the options / dealfinding settings to a new options page inside the main TSM window.
|
||||
*Added an option to shop for blackfallow ink for trade-ins automatically if cheaper.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.1.8
|
||||
*Added a few more bug fixes.
|
||||
|
||||
v0.1.7
|
||||
*Fixed a bug with Dealfinding occasionally giving an error.
|
||||
*Localization files should now be loaded correctly.
|
||||
*Fixed inferno ink ratios.
|
||||
*Removed the enchanting icon as it's not yet implemented.
|
||||
*Many fixes for the "no auctions found..." issue.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.1.6
|
||||
*Dealfinding list is now stored globally instead of by profile.
|
||||
*Fixed milling coefficients.
|
||||
*Many other minor bug fixes and improvements.
|
||||
|
||||
v0.1.5
|
||||
*Fixed a major bug that was preventing some gems from being purchased through the automatic mode.
|
||||
|
||||
v0.1.4
|
||||
*Multiple bug fixes with buying items in all different modes.
|
||||
|
||||
v0.1.3
|
||||
*Fixed another bug caused by setting a max price in the destroying section of Shopping.
|
||||
|
||||
v0.1.2
|
||||
*Few minor bug fixes.
|
||||
|
||||
v0.1.1
|
||||
*Fixed a bug that caused the addon to not upload properly.
|
||||
|
||||
v0.1
|
||||
*First version!
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
All rights are reserved unless explicitly stated below. The "license
|
||||
holder" is the manager of this project, Sapu94 (sapu94@gmail.com).
|
||||
|
||||
Exceptions:
|
||||
1) The use of this addon in accordance with all applicable terms set by
|
||||
Blizzard Entertainment for addon use and game play is permitted.
|
||||
2) Modifications for personal use or submission to license holder are
|
||||
permitted. Modified versions of the works, derivative works, modified
|
||||
sections of the works, and instructions for how to modify the works are
|
||||
all prohibited unless the express consent of the license holder is
|
||||
granted.
|
||||
|
||||
Comments:
|
||||
1) Permission to use sections of the works in your own work is very
|
||||
likely to be granted upon contacting the license holder.
|
||||
2) The right to distribute the works is reserved by the license holder.
|
||||
In no way or form may a person other than the license holder distribute
|
||||
the works.
|
||||
3) Please contact the license holder if you have any questions at all
|
||||
regarding this license at the following email address: sapu94@gmail.com
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - deDE
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "deDE")
|
||||
if not L then return end
|
||||
|
||||
-- L["Action"] = ""
|
||||
-- L["Added '%s' to your favorite searches."] = ""
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
-- L["Bid Percent"] = ""
|
||||
-- L["Buyout"] = ""
|
||||
--[==[ L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = "" ]==]
|
||||
-- L["Custom Filter"] = ""
|
||||
-- L["Default Post Undercut Amount"] = ""
|
||||
-- L["Destroy Mode"] = ""
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
-- L["Done Scanning"] = ""
|
||||
-- L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = ""
|
||||
-- L["Error creating operation. Operation with name '%s' already exists."] = ""
|
||||
-- L["Even (5/10/15/20) Stacks Only"] = ""
|
||||
-- L["Favorite Searches"] = ""
|
||||
-- L["General"] = ""
|
||||
-- L["General Operation Options"] = ""
|
||||
L["General Options"] = "Allgemeine Einstellungen"
|
||||
-- L["General Settings"] = ""
|
||||
-- L["Give the new operation a name. A descriptive name will help you find this operation later."] = ""
|
||||
-- L["Hide Grouped Items"] = ""
|
||||
-- L["If checked, auctions above the max price will be shown."] = ""
|
||||
-- L["If checked, only auctions posted in even quantities will be considered for purchasing."] = ""
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
-- L["If set, only items which are usable by your character will be included in the results."] = ""
|
||||
-- L["If set, only items which exactly match the search filter you have set will be included in the results."] = ""
|
||||
-- L["Import"] = ""
|
||||
-- L["Import Favorite Search"] = ""
|
||||
-- L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = ""
|
||||
-- L["Invalid custom price source for %s. %s"] = ""
|
||||
-- L["Invalid destroy search: '%s'"] = ""
|
||||
-- L["Invalid destroy target: '%s'"] = ""
|
||||
-- L["Invalid Even Only Filter"] = ""
|
||||
-- L["Invalid Exact Only Filter"] = ""
|
||||
-- L["Invalid Filter"] = ""
|
||||
-- L["Invalid Item Level"] = ""
|
||||
-- L["Invalid Item Rarity"] = ""
|
||||
-- L["Invalid Item SubType"] = ""
|
||||
-- L["Invalid Item Type"] = ""
|
||||
-- L["Invalid Max Quantity"] = ""
|
||||
-- L["Invalid Min Level"] = ""
|
||||
-- L["Invalid target item for destroy search: '%s'"] = ""
|
||||
-- L["Invalid Usable Only Filter"] = ""
|
||||
-- L["Item"] = ""
|
||||
-- L["Item Class"] = ""
|
||||
-- L["Item Level Range:"] = ""
|
||||
-- L["Item SubClass"] = ""
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
-- L["Left-Click to run this search."] = ""
|
||||
-- L["Log"] = ""
|
||||
-- L["Management"] = ""
|
||||
L["% Market Value"] = "% Marktwert"
|
||||
-- L["Market Value Price Source"] = ""
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
-- L["Maximum Auction Price (per item)"] = ""
|
||||
-- L["Maximum quantity purchased for destroy search."] = ""
|
||||
-- L["Maximum quantity purchased for %s."] = ""
|
||||
-- L["Maximum Quantity to Buy:"] = ""
|
||||
L["% Max Price"] = "% Marktpreis"
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
-- L["Minimum Rarity"] = ""
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
-- L["New Operation"] = ""
|
||||
-- L["No recent AuctionDB scan data found."] = ""
|
||||
-- L["Normal Mode"] = ""
|
||||
-- L["Normal Post Price"] = ""
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
-- L["Num"] = ""
|
||||
-- L["Operation Name"] = ""
|
||||
-- L["Operations"] = ""
|
||||
L["Options"] = "Einstellungen"
|
||||
-- L["Other"] = ""
|
||||
-- L["Paste the search you'd like to import into the box below."] = ""
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
-- L["Preparing Filter %d / %d"] = ""
|
||||
-- L["Preparing filters..."] = ""
|
||||
-- L["Press Ctrl-C to copy this saved search."] = ""
|
||||
-- L["Price"] = ""
|
||||
-- L["Quick Posting"] = ""
|
||||
-- L["Quick Posting Duration"] = ""
|
||||
-- L["Quick Posting Price"] = ""
|
||||
-- L["Recent Searches"] = ""
|
||||
-- L["Relationships"] = ""
|
||||
-- L["Removed '%s' from your favorite searches."] = ""
|
||||
-- L["Removed '%s' from your recent searches."] = ""
|
||||
-- L["Required Level Range:"] = ""
|
||||
-- L["Reset Filters"] = ""
|
||||
-- L["Right-Click to favorite this recent search."] = ""
|
||||
-- L["Right-Click to remove from favorite searches."] = ""
|
||||
-- L["Saved Searches"] = ""
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
-- L["Search Filter:"] = ""
|
||||
-- L["Select the groups which you would like to include in the search."] = ""
|
||||
-- L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = ""
|
||||
-- L["Shift-Left-Click to export this search."] = ""
|
||||
-- L["Shift-Right-Click to remove this recent search."] = ""
|
||||
-- L["Shopping for auctions including those above the max price."] = ""
|
||||
-- L["Shopping for auctions with a max price set."] = ""
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
-- L["Skipped the following search term because it's invalid."] = ""
|
||||
-- L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = ""
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
-- L["Start Search"] = ""
|
||||
-- L["Start Sniper"] = ""
|
||||
-- L["Start Vendor Search"] = ""
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
-- L["% Target Value"] = ""
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
-- L["Unknown Filter"] = ""
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
-- L["% Vendor Price"] = ""
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = "Im Zerstörenmodus, gibst du einfach einen Zielgegenstand (Tinte/Pigment, Verzaubermaterial, Edelstein, etc) in das Suchfeld ein um alle Gegenstände zu erhalten, die bei Zerstörung den Zielgegenstand enthalten." -- Needs review
|
||||
L["When in normal mode, you may run simple and filtered searches of the auction house."] = "Im Normalmodus, kannst du einfache oder gefilterte Suchen des Auktionshauses durchführen." -- Needs review
|
||||
@@ -0,0 +1,161 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - enUS
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkill-Master/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "enUS", true)
|
||||
if not L then return end
|
||||
|
||||
L["% DE Value"] = true
|
||||
L["% Market Value"] = true
|
||||
L["% Mat Price"] = true
|
||||
L["% Max Price"] = true
|
||||
L["% Target Value"] = true
|
||||
L["% Vendor Price"] = true
|
||||
L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = true
|
||||
L["Action"] = true
|
||||
L["Added '%s' to your favorite searches."] = true
|
||||
L["Below Custom Price ('0c' to disable)"] = true
|
||||
L["Below Max Price"] = true
|
||||
L["Below Vendor Sell Price"] = true
|
||||
L["Bid Percent"] = true
|
||||
L["Buyout"] = true
|
||||
L["Click to search for an item.\nShift-Click to post at market value."] = true
|
||||
L["Custom Filter"] = true
|
||||
L["Default Post Undercut Amount"] = true
|
||||
L["Destroy Mode"] = true
|
||||
L["Disenchant Search Profit: %s"] = true
|
||||
L["Done Scanning"] = true
|
||||
L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = true
|
||||
L["Error creating operation. Operation with name '%s' already exists."] = true
|
||||
L["Even (5/10/15/20) Stacks Only"] = true
|
||||
L["Favorite Searches"] = true
|
||||
L["General Operation Options"] = true
|
||||
L["General Options"] = true
|
||||
L["General Settings"] = true
|
||||
L["General"] = true
|
||||
L["Give the new operation a name. A descriptive name will help you find this operation later."] = true
|
||||
L["Hide Grouped Items"] = true
|
||||
L["If checked, auctions above the max price will be shown."] = true
|
||||
L["If checked, only auctions posted in even quantities will be considered for purchasing."] = true
|
||||
L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = true
|
||||
L["If set, only items which are usable by your character will be included in the results."] = true
|
||||
L["If set, only items which exactly match the search filter you have set will be included in the results."] = true
|
||||
L["Import Favorite Search"] = true
|
||||
L["Import"] = true
|
||||
L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/80/i200/i285|r' will search for all leather armor of epic quality that requires level 80 and has an ilvl between 200 and 285 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = true
|
||||
L["Invalid Even Only Filter"] = true
|
||||
L["Invalid Exact Only Filter"] = true
|
||||
L["Invalid Filter"] = true
|
||||
L["Invalid Item Level"] = true
|
||||
L["Invalid Item Rarity"] = true
|
||||
L["Invalid Item SubType"] = true
|
||||
L["Invalid Item Type"] = true
|
||||
L["Invalid Max Quantity"] = true
|
||||
L["Invalid Min Level"] = true
|
||||
L["Invalid Usable Only Filter"] = true
|
||||
L["Invalid custom price source for %s. %s"] = true
|
||||
L["Invalid destroy search: '%s'"] = true
|
||||
L["Invalid destroy target: '%s'"] = true
|
||||
L["Invalid target item for destroy search: '%s'"] = true
|
||||
L["Item Class"] = true
|
||||
L["Item Level Range:"] = true
|
||||
L["Item SubClass"] = true
|
||||
L["Item"] = true
|
||||
L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = true
|
||||
L["Items which are below their vendor sell price will be displayed in Sniper searches."] = true
|
||||
L["Items which are below this custom price will be displayed in Sniper searches."] = true
|
||||
L["Left-Click to run this search."] = true
|
||||
L["Left-Click to run this search."] = true
|
||||
L["Log"] = true
|
||||
L["Management"] = true
|
||||
L["Market Value Price Source"] = true
|
||||
L["Max Disenchant Level"] = true
|
||||
L["Max Disenchant Search Percent"] = true
|
||||
L["Max Shopping Price:"] = true
|
||||
L["Maximum Auction Price (per item)"] = true
|
||||
L["Maximum Quantity to Buy:"] = true
|
||||
L["Maximum quantity purchased for %s."] = true
|
||||
L["Maximum quantity purchased for destroy search."] = true
|
||||
L["Min Disenchant Level"] = true
|
||||
L["Minimum Rarity"] = true
|
||||
L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%scopper ore; gold ore|r' will search for both copper and gold ore."] = true
|
||||
L["New Operation"] = true
|
||||
L["NOTE: The scan must be stopped before you can buy anything."] = true
|
||||
L["No recent AuctionDB scan data found."] = true
|
||||
L["Normal Mode"] = true
|
||||
L["Normal Post Price"] = true
|
||||
L["Num"] = true
|
||||
L["Operation Name"] = true
|
||||
L["Operations"] = true
|
||||
L["Options"] = true
|
||||
L["Paste the search you'd like to import into the box below."] = true
|
||||
L["Paste the search you'd like to import into the box below."] = true
|
||||
L["Posted a %s with a buyout of %s."] = true
|
||||
L["Preparing Filter %d / %d"] = true
|
||||
L["Preparing filters..."] = true
|
||||
L["Press Ctrl-C to copy this saved search."] = true
|
||||
L["Price"] = true
|
||||
L["Quick Posting Duration"] = true
|
||||
L["Quick Posting Price"] = true
|
||||
L["Quick Posting"] = true
|
||||
L["Recent Searches"] = true
|
||||
L["Relationships"] = true
|
||||
L["Removed '%s' from your favorite searches."] = true
|
||||
L["Removed '%s' from your recent searches."] = true
|
||||
L["Required Level Range:"] = true
|
||||
L["Reset Filters"] = true
|
||||
L["Right-Click to favorite this recent search."] = true
|
||||
L["Right-Click to remove from favorite searches."] = true
|
||||
L["Saved Searches"] = true
|
||||
L["Scanning %d / %d (Page %d / %d)"] = true
|
||||
L["Search Filter:"] = true
|
||||
L["Select the groups which you would like to include in the search."] = true
|
||||
L["Shift-Left-Click to export this search."] = true
|
||||
L["Shift-Left-Click to export this search."] = true
|
||||
L["Shift-Right-Click to remove this recent search."] = true
|
||||
L["Shopping for auctions including those above the max price."] = true
|
||||
L["Shopping for auctions with a max price set."] = true
|
||||
L["Shopping for even stacks including those above the max price"] = true
|
||||
L["Shopping for even stacks with a max price set."] = true
|
||||
L["Shopping operations contain settings items which you regularly buy from the auction house."] = true
|
||||
L["Show Auctions Above Max Price"] = true
|
||||
L["Show Shopping Max Price in Tooltip"] = true
|
||||
L["Sidebar Pages:"] = true
|
||||
L["Skipped the following search term because it's invalid."] = true
|
||||
L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = true
|
||||
L["Sniper Options"] = true
|
||||
L["Start Disenchant Search"] = true
|
||||
L["Start Search"] = true
|
||||
L["Start Sniper"] = true
|
||||
L["Start Vendor Search"] = true
|
||||
L["Stop"] = true
|
||||
L["Stop Sniper"] = true
|
||||
L["TSM Groups"] = true
|
||||
L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = true
|
||||
L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = true
|
||||
L["The duration at which items will be posted via the 'Quick Posting' frame."] = true
|
||||
L["The highest price per item you will pay for items in affected by this operation."] = true
|
||||
L["The vendor search looks for items on the AH below their vendor sell price."] = true
|
||||
L["This is how Shopping calculates the '% Market Value' column in the search results."] = true
|
||||
L["This is the default price Shopping will suggest to post items at when there's no others posted."] = true
|
||||
L["This is the maximum item level that the Other > Disenchant search will display results for."] = true
|
||||
L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = true
|
||||
L["This is the minimum item level that the Other > Disenchant search will display results for."] = true
|
||||
L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = true
|
||||
L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = true
|
||||
L["Unknown Filter"] = true
|
||||
L["Unknown milling search target: '%s'"] = true
|
||||
L["Vendor Search Profit: %s"] = true
|
||||
L["Warning: The max disenchant level must be higher than the min disenchant level."] = true
|
||||
L["Warning: The min disenchant level must be lower than the max disenchant level."] = true
|
||||
L["What to set the default undercut to when posting items with Shopping."] = true
|
||||
L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = true
|
||||
L["When in normal mode, you may run simple and filtered searches of the auction house."] = true
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - esES
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "esES")
|
||||
if not L then return end
|
||||
|
||||
-- L["Action"] = ""
|
||||
-- L["Added '%s' to your favorite searches."] = ""
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
-- L["Bid Percent"] = ""
|
||||
-- L["Buyout"] = ""
|
||||
--[==[ L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = "" ]==]
|
||||
-- L["Custom Filter"] = ""
|
||||
-- L["Default Post Undercut Amount"] = ""
|
||||
-- L["Destroy Mode"] = ""
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
-- L["Done Scanning"] = ""
|
||||
-- L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = ""
|
||||
-- L["Error creating operation. Operation with name '%s' already exists."] = ""
|
||||
-- L["Even (5/10/15/20) Stacks Only"] = ""
|
||||
-- L["Favorite Searches"] = ""
|
||||
-- L["General"] = ""
|
||||
-- L["General Operation Options"] = ""
|
||||
L["General Options"] = "Opciones generales" -- Needs review
|
||||
-- L["General Settings"] = ""
|
||||
-- L["Give the new operation a name. A descriptive name will help you find this operation later."] = ""
|
||||
-- L["Hide Grouped Items"] = ""
|
||||
-- L["If checked, auctions above the max price will be shown."] = ""
|
||||
-- L["If checked, only auctions posted in even quantities will be considered for purchasing."] = ""
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
-- L["If set, only items which are usable by your character will be included in the results."] = ""
|
||||
-- L["If set, only items which exactly match the search filter you have set will be included in the results."] = ""
|
||||
-- L["Import"] = ""
|
||||
-- L["Import Favorite Search"] = ""
|
||||
-- L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = ""
|
||||
-- L["Invalid custom price source for %s. %s"] = ""
|
||||
-- L["Invalid destroy search: '%s'"] = ""
|
||||
-- L["Invalid destroy target: '%s'"] = ""
|
||||
-- L["Invalid Even Only Filter"] = ""
|
||||
-- L["Invalid Exact Only Filter"] = ""
|
||||
-- L["Invalid Filter"] = ""
|
||||
-- L["Invalid Item Level"] = ""
|
||||
-- L["Invalid Item Rarity"] = ""
|
||||
-- L["Invalid Item SubType"] = ""
|
||||
-- L["Invalid Item Type"] = ""
|
||||
-- L["Invalid Max Quantity"] = ""
|
||||
-- L["Invalid Min Level"] = ""
|
||||
-- L["Invalid target item for destroy search: '%s'"] = ""
|
||||
-- L["Invalid Usable Only Filter"] = ""
|
||||
-- L["Item"] = ""
|
||||
-- L["Item Class"] = ""
|
||||
-- L["Item Level Range:"] = ""
|
||||
-- L["Item SubClass"] = ""
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
-- L["Left-Click to run this search."] = ""
|
||||
-- L["Log"] = ""
|
||||
-- L["Management"] = ""
|
||||
L["% Market Value"] = "% Valor en el Mercado" -- Needs review
|
||||
-- L["Market Value Price Source"] = ""
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
-- L["Maximum Auction Price (per item)"] = ""
|
||||
-- L["Maximum quantity purchased for destroy search."] = ""
|
||||
-- L["Maximum quantity purchased for %s."] = ""
|
||||
-- L["Maximum Quantity to Buy:"] = ""
|
||||
L["% Max Price"] = "% Precio Máximo" -- Needs review
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
-- L["Minimum Rarity"] = ""
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
-- L["New Operation"] = ""
|
||||
-- L["No recent AuctionDB scan data found."] = ""
|
||||
-- L["Normal Mode"] = ""
|
||||
-- L["Normal Post Price"] = ""
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
-- L["Num"] = ""
|
||||
-- L["Operation Name"] = ""
|
||||
-- L["Operations"] = ""
|
||||
L["Options"] = "Opciones" -- Needs review
|
||||
-- L["Other"] = ""
|
||||
-- L["Paste the search you'd like to import into the box below."] = ""
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
-- L["Preparing Filter %d / %d"] = ""
|
||||
-- L["Preparing filters..."] = ""
|
||||
-- L["Press Ctrl-C to copy this saved search."] = ""
|
||||
-- L["Price"] = ""
|
||||
-- L["Quick Posting"] = ""
|
||||
-- L["Quick Posting Duration"] = ""
|
||||
-- L["Quick Posting Price"] = ""
|
||||
-- L["Recent Searches"] = ""
|
||||
-- L["Relationships"] = ""
|
||||
-- L["Removed '%s' from your favorite searches."] = ""
|
||||
-- L["Removed '%s' from your recent searches."] = ""
|
||||
-- L["Required Level Range:"] = ""
|
||||
-- L["Reset Filters"] = ""
|
||||
-- L["Right-Click to favorite this recent search."] = ""
|
||||
-- L["Right-Click to remove from favorite searches."] = ""
|
||||
-- L["Saved Searches"] = ""
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
-- L["Search Filter:"] = ""
|
||||
-- L["Select the groups which you would like to include in the search."] = ""
|
||||
-- L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = ""
|
||||
-- L["Shift-Left-Click to export this search."] = ""
|
||||
-- L["Shift-Right-Click to remove this recent search."] = ""
|
||||
-- L["Shopping for auctions including those above the max price."] = ""
|
||||
-- L["Shopping for auctions with a max price set."] = ""
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
-- L["Skipped the following search term because it's invalid."] = ""
|
||||
-- L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = ""
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
-- L["Start Search"] = ""
|
||||
-- L["Start Sniper"] = ""
|
||||
-- L["Start Vendor Search"] = ""
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
-- L["% Target Value"] = ""
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
-- L["Unknown Filter"] = ""
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
-- L["% Vendor Price"] = ""
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
-- L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = ""
|
||||
-- L["When in normal mode, you may run simple and filtered searches of the auction house."] = ""
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - esMX
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "esMX")
|
||||
if not L then return end
|
||||
|
||||
-- L["Action"] = ""
|
||||
-- L["Added '%s' to your favorite searches."] = ""
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
-- L["Bid Percent"] = ""
|
||||
-- L["Buyout"] = ""
|
||||
--[==[ L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = "" ]==]
|
||||
-- L["Custom Filter"] = ""
|
||||
-- L["Default Post Undercut Amount"] = ""
|
||||
-- L["Destroy Mode"] = ""
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
-- L["Done Scanning"] = ""
|
||||
-- L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = ""
|
||||
-- L["Error creating operation. Operation with name '%s' already exists."] = ""
|
||||
-- L["Even (5/10/15/20) Stacks Only"] = ""
|
||||
-- L["Favorite Searches"] = ""
|
||||
-- L["General"] = ""
|
||||
-- L["General Operation Options"] = ""
|
||||
-- L["General Options"] = ""
|
||||
-- L["General Settings"] = ""
|
||||
-- L["Give the new operation a name. A descriptive name will help you find this operation later."] = ""
|
||||
-- L["Hide Grouped Items"] = ""
|
||||
-- L["If checked, auctions above the max price will be shown."] = ""
|
||||
-- L["If checked, only auctions posted in even quantities will be considered for purchasing."] = ""
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
-- L["If set, only items which are usable by your character will be included in the results."] = ""
|
||||
-- L["If set, only items which exactly match the search filter you have set will be included in the results."] = ""
|
||||
-- L["Import"] = ""
|
||||
-- L["Import Favorite Search"] = ""
|
||||
-- L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = ""
|
||||
-- L["Invalid custom price source for %s. %s"] = ""
|
||||
-- L["Invalid destroy search: '%s'"] = ""
|
||||
-- L["Invalid destroy target: '%s'"] = ""
|
||||
-- L["Invalid Even Only Filter"] = ""
|
||||
-- L["Invalid Exact Only Filter"] = ""
|
||||
-- L["Invalid Filter"] = ""
|
||||
-- L["Invalid Item Level"] = ""
|
||||
-- L["Invalid Item Rarity"] = ""
|
||||
-- L["Invalid Item SubType"] = ""
|
||||
-- L["Invalid Item Type"] = ""
|
||||
-- L["Invalid Max Quantity"] = ""
|
||||
-- L["Invalid Min Level"] = ""
|
||||
-- L["Invalid target item for destroy search: '%s'"] = ""
|
||||
-- L["Invalid Usable Only Filter"] = ""
|
||||
-- L["Item"] = ""
|
||||
-- L["Item Class"] = ""
|
||||
-- L["Item Level Range:"] = ""
|
||||
-- L["Item SubClass"] = ""
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
-- L["Left-Click to run this search."] = ""
|
||||
-- L["Log"] = ""
|
||||
-- L["Management"] = ""
|
||||
-- L["% Market Value"] = ""
|
||||
-- L["Market Value Price Source"] = ""
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
-- L["Maximum Auction Price (per item)"] = ""
|
||||
-- L["Maximum quantity purchased for destroy search."] = ""
|
||||
-- L["Maximum quantity purchased for %s."] = ""
|
||||
-- L["Maximum Quantity to Buy:"] = ""
|
||||
-- L["% Max Price"] = ""
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
-- L["Minimum Rarity"] = ""
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
-- L["New Operation"] = ""
|
||||
-- L["No recent AuctionDB scan data found."] = ""
|
||||
-- L["Normal Mode"] = ""
|
||||
-- L["Normal Post Price"] = ""
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
-- L["Num"] = ""
|
||||
-- L["Operation Name"] = ""
|
||||
-- L["Operations"] = ""
|
||||
-- L["Options"] = ""
|
||||
-- L["Other"] = ""
|
||||
-- L["Paste the search you'd like to import into the box below."] = ""
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
-- L["Preparing Filter %d / %d"] = ""
|
||||
-- L["Preparing filters..."] = ""
|
||||
-- L["Press Ctrl-C to copy this saved search."] = ""
|
||||
-- L["Price"] = ""
|
||||
-- L["Quick Posting"] = ""
|
||||
-- L["Quick Posting Duration"] = ""
|
||||
-- L["Quick Posting Price"] = ""
|
||||
-- L["Recent Searches"] = ""
|
||||
-- L["Relationships"] = ""
|
||||
-- L["Removed '%s' from your favorite searches."] = ""
|
||||
-- L["Removed '%s' from your recent searches."] = ""
|
||||
-- L["Required Level Range:"] = ""
|
||||
-- L["Reset Filters"] = ""
|
||||
-- L["Right-Click to favorite this recent search."] = ""
|
||||
-- L["Right-Click to remove from favorite searches."] = ""
|
||||
-- L["Saved Searches"] = ""
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
-- L["Search Filter:"] = ""
|
||||
-- L["Select the groups which you would like to include in the search."] = ""
|
||||
-- L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = ""
|
||||
-- L["Shift-Left-Click to export this search."] = ""
|
||||
-- L["Shift-Right-Click to remove this recent search."] = ""
|
||||
-- L["Shopping for auctions including those above the max price."] = ""
|
||||
-- L["Shopping for auctions with a max price set."] = ""
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
-- L["Skipped the following search term because it's invalid."] = ""
|
||||
-- L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = ""
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
-- L["Start Search"] = ""
|
||||
-- L["Start Sniper"] = ""
|
||||
-- L["Start Vendor Search"] = ""
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
-- L["% Target Value"] = ""
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
-- L["Unknown Filter"] = ""
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
-- L["% Vendor Price"] = ""
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
-- L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = ""
|
||||
-- L["When in normal mode, you may run simple and filtered searches of the auction house."] = ""
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - frFR
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "frFR")
|
||||
if not L then return end
|
||||
|
||||
-- L["Action"] = ""
|
||||
-- L["Added '%s' to your favorite searches."] = ""
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
-- L["Bid Percent"] = ""
|
||||
-- L["Buyout"] = ""
|
||||
--[==[ L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = "" ]==]
|
||||
-- L["Custom Filter"] = ""
|
||||
-- L["Default Post Undercut Amount"] = ""
|
||||
-- L["Destroy Mode"] = ""
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
-- L["Done Scanning"] = ""
|
||||
-- L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = ""
|
||||
-- L["Error creating operation. Operation with name '%s' already exists."] = ""
|
||||
-- L["Even (5/10/15/20) Stacks Only"] = ""
|
||||
-- L["Favorite Searches"] = ""
|
||||
-- L["General"] = ""
|
||||
-- L["General Operation Options"] = ""
|
||||
L["General Options"] = "Options générales"
|
||||
-- L["General Settings"] = ""
|
||||
-- L["Give the new operation a name. A descriptive name will help you find this operation later."] = ""
|
||||
-- L["Hide Grouped Items"] = ""
|
||||
-- L["If checked, auctions above the max price will be shown."] = ""
|
||||
-- L["If checked, only auctions posted in even quantities will be considered for purchasing."] = ""
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
-- L["If set, only items which are usable by your character will be included in the results."] = ""
|
||||
-- L["If set, only items which exactly match the search filter you have set will be included in the results."] = ""
|
||||
-- L["Import"] = ""
|
||||
-- L["Import Favorite Search"] = ""
|
||||
-- L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = ""
|
||||
-- L["Invalid custom price source for %s. %s"] = ""
|
||||
-- L["Invalid destroy search: '%s'"] = ""
|
||||
-- L["Invalid destroy target: '%s'"] = ""
|
||||
-- L["Invalid Even Only Filter"] = ""
|
||||
-- L["Invalid Exact Only Filter"] = ""
|
||||
-- L["Invalid Filter"] = ""
|
||||
-- L["Invalid Item Level"] = ""
|
||||
-- L["Invalid Item Rarity"] = ""
|
||||
-- L["Invalid Item SubType"] = ""
|
||||
-- L["Invalid Item Type"] = ""
|
||||
-- L["Invalid Max Quantity"] = ""
|
||||
-- L["Invalid Min Level"] = ""
|
||||
-- L["Invalid target item for destroy search: '%s'"] = ""
|
||||
-- L["Invalid Usable Only Filter"] = ""
|
||||
-- L["Item"] = ""
|
||||
-- L["Item Class"] = ""
|
||||
-- L["Item Level Range:"] = ""
|
||||
-- L["Item SubClass"] = ""
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
-- L["Left-Click to run this search."] = ""
|
||||
-- L["Log"] = ""
|
||||
-- L["Management"] = ""
|
||||
-- L["% Market Value"] = ""
|
||||
-- L["Market Value Price Source"] = ""
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
-- L["Maximum Auction Price (per item)"] = ""
|
||||
-- L["Maximum quantity purchased for destroy search."] = ""
|
||||
-- L["Maximum quantity purchased for %s."] = ""
|
||||
-- L["Maximum Quantity to Buy:"] = ""
|
||||
-- L["% Max Price"] = ""
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
-- L["Minimum Rarity"] = ""
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
-- L["New Operation"] = ""
|
||||
-- L["No recent AuctionDB scan data found."] = ""
|
||||
-- L["Normal Mode"] = ""
|
||||
-- L["Normal Post Price"] = ""
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
-- L["Num"] = ""
|
||||
-- L["Operation Name"] = ""
|
||||
-- L["Operations"] = ""
|
||||
L["Options"] = "Options"
|
||||
-- L["Other"] = ""
|
||||
-- L["Paste the search you'd like to import into the box below."] = ""
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
-- L["Preparing Filter %d / %d"] = ""
|
||||
-- L["Preparing filters..."] = ""
|
||||
-- L["Press Ctrl-C to copy this saved search."] = ""
|
||||
-- L["Price"] = ""
|
||||
-- L["Quick Posting"] = ""
|
||||
-- L["Quick Posting Duration"] = ""
|
||||
-- L["Quick Posting Price"] = ""
|
||||
-- L["Recent Searches"] = ""
|
||||
-- L["Relationships"] = ""
|
||||
-- L["Removed '%s' from your favorite searches."] = ""
|
||||
-- L["Removed '%s' from your recent searches."] = ""
|
||||
-- L["Required Level Range:"] = ""
|
||||
-- L["Reset Filters"] = ""
|
||||
-- L["Right-Click to favorite this recent search."] = ""
|
||||
-- L["Right-Click to remove from favorite searches."] = ""
|
||||
-- L["Saved Searches"] = ""
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
-- L["Search Filter:"] = ""
|
||||
-- L["Select the groups which you would like to include in the search."] = ""
|
||||
-- L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = ""
|
||||
-- L["Shift-Left-Click to export this search."] = ""
|
||||
-- L["Shift-Right-Click to remove this recent search."] = ""
|
||||
-- L["Shopping for auctions including those above the max price."] = ""
|
||||
-- L["Shopping for auctions with a max price set."] = ""
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
-- L["Skipped the following search term because it's invalid."] = ""
|
||||
-- L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = ""
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
-- L["Start Search"] = ""
|
||||
-- L["Start Sniper"] = ""
|
||||
-- L["Start Vendor Search"] = ""
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
-- L["% Target Value"] = ""
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
-- L["Unknown Filter"] = ""
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
-- L["% Vendor Price"] = ""
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
-- L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = ""
|
||||
-- L["When in normal mode, you may run simple and filtered searches of the auction house."] = ""
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - koKR
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "koKR")
|
||||
if not L then return end
|
||||
|
||||
L["Action"] = "경매" -- Needs review
|
||||
L["Added '%s' to your favorite searches."] = "'%s'을(를) 즐겨찾기 검색에 추가합니다." -- Needs review
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
L["Bid Percent"] = "입찰가 백분율"
|
||||
L["Buyout"] = "즉시 구매가" -- Needs review
|
||||
L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = "클릭하면 아이템을 검색합니다.\\nShift-Click 하면 시장 가격으로 등록합니다." -- Needs review
|
||||
L["Custom Filter"] = "사용자 필터" -- Needs review
|
||||
L["Default Post Undercut Amount"] = "기본 등록 에누리 금액" -- Needs review
|
||||
L["Destroy Mode"] = "추출 모드" -- Needs review
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
L["Done Scanning"] = "검색 완료" -- Needs review
|
||||
L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = "이 상자에 검색어를 입력합니다. 또한, 더 복잡한 검색을 위해서 다음과 같은 옵션을 사용할 수 있습니다." -- Needs review
|
||||
L["Error creating operation. Operation with name '%s' already exists."] = "작업 생성 에러. 이름이 '%s'인 작업은 이미 존재합니다." -- Needs review
|
||||
L["Even (5/10/15/20) Stacks Only"] = "맞춤(5/10/15/20) 묶음만" -- Needs review
|
||||
L["Favorite Searches"] = "즐겨찾기 검색" -- Needs review
|
||||
L["General"] = "일반" -- Needs review
|
||||
L["General Operation Options"] = "일반 작업 옵션" -- Needs review
|
||||
L["General Options"] = "일반 옵션"
|
||||
L["General Settings"] = "일반 설정" -- Needs review
|
||||
L["Give the new operation a name. A descriptive name will help you find this operation later."] = "새 작업의 이름을 지정하세요. 설명이 포함된 이름은 나중에 이 작업을 찾는 데 도움이 됩니다." -- Needs review
|
||||
L["Hide Grouped Items"] = "그룹 아이템 숨기기" -- Needs review
|
||||
L["If checked, auctions above the max price will be shown."] = "선택하면, 최대 가격 이상의 경매 물품도 표시됩니다." -- Needs review
|
||||
L["If checked, only auctions posted in even quantities will be considered for purchasing."] = "선택하면, 맞춤 수량으로 등록된 물품만 구매 대상이 됩니다." -- Needs review
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
L["If set, only items which are usable by your character will be included in the results."] = "설정하면, 현재 캐릭터가 사용할 수 있는 아이템만 검색 결과에 포함됩니다." -- Needs review
|
||||
L["If set, only items which exactly match the search filter you have set will be included in the results."] = "설정하면, 검색 필터와 정확하게 일치하는 아이템만 검색 결과에 포함됩니다." -- Needs review
|
||||
L["Import"] = "불러오기" -- Needs review
|
||||
L["Import Favorite Search"] = "즐겨찾기 검색 불러오기" -- Needs review
|
||||
L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = "인라인 필터:|r 희귀성, 레벨, 아이템 형식 등과 같은 일반 검색 필터를 쉽게 추가할 수 있습니다. 예를 들면, '%sarmor/leather/epic/85/i350/i377|r'은 에픽 가죽 방어구 중 레벨 제한이 85이고 아이템 레벨이 350 에서 377 사이인 모든 아이템을 검색합니다. 또한 '%sinferno ruby/exact|r'는 지옥 루비(세공되지 않은)만을 검색합니다." -- Needs review
|
||||
L["Invalid custom price source for %s. %s"] = "잘못된 사용자 가격 출처 %s. %s" -- Needs review
|
||||
L["Invalid destroy search: '%s'"] = "잘못된 추출 검색: '%s'" -- Needs review
|
||||
L["Invalid destroy target: '%s'"] = "잘못된 추출 대상: '%s'" -- Needs review
|
||||
L["Invalid Even Only Filter"] = "잘못된 필터" -- Needs review
|
||||
L["Invalid Exact Only Filter"] = "잘못된 필터"
|
||||
L["Invalid Filter"] = "잘못된 필터"
|
||||
L["Invalid Item Level"] = "잘못된 아이템 레벨"
|
||||
L["Invalid Item Rarity"] = "잘못된 아이템 품질"
|
||||
L["Invalid Item SubType"] = "잘못된 보조 형식"
|
||||
L["Invalid Item Type"] = "잘못된 아이템 형식"
|
||||
L["Invalid Max Quantity"] = "잘못된 최대 수량" -- Needs review
|
||||
L["Invalid Min Level"] = "잘못된 최소 레벨"
|
||||
L["Invalid target item for destroy search: '%s'"] = "잘못된 추출 검색 대상 아이템: '%s'" -- Needs review
|
||||
L["Invalid Usable Only Filter"] = "잘못된 필터"
|
||||
L["Item"] = "아이템"
|
||||
L["Item Class"] = "아이템 종류" -- Needs review
|
||||
L["Item Level Range:"] = "아이템 레벨 범위:" -- Needs review
|
||||
L["Item SubClass"] = "아이템 하위 종류" -- Needs review
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
L["Left-Click to run this search."] = "Left-Click으로 이 검색을 수행합니다." -- Needs review
|
||||
L["Log"] = "로그" -- Needs review
|
||||
-- L["Management"] = ""
|
||||
L["% Market Value"] = "시장가의 %"
|
||||
L["Market Value Price Source"] = "시장 가치 가격 출처" -- Needs review
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
L["Maximum Auction Price (per item)"] = "최대 경매 가격 (아이템당)" -- Needs review
|
||||
L["Maximum quantity purchased for destroy search."] = "추출 검색으로 최대 수량 구매하였습니다." -- Needs review
|
||||
L["Maximum quantity purchased for %s."] = "%s을(를) 최대 수량 구매하였습니다." -- Needs review
|
||||
L["Maximum Quantity to Buy:"] = "최대 구매 수량:" -- Needs review
|
||||
L["% Max Price"] = "최대가의 %"
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
L["Minimum Rarity"] = "최소 품질" -- Needs review
|
||||
L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = "다중 검색어:|r 검색어를 세미콜론(;)으로 분리하여 입력하면 여러 가지 물품을 한 번에 검색할 수 있습니다. 예를 들면, '%s엘레멘티움 광석; 흑요암 광석|r'은 엘레멘티움과 흑요암 광석을 동시에 검색합니다." -- Needs review
|
||||
L["New Operation"] = "새 작업" -- Needs review
|
||||
L["No recent AuctionDB scan data found."] = "최근 AuctionDB 검색 데이터가 없습니다." -- Needs review
|
||||
L["Normal Mode"] = "일반 모드" -- Needs review
|
||||
L["Normal Post Price"] = "일반 등록 가격" -- Needs review
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
L["Num"] = "개수" -- Needs review
|
||||
L["Operation Name"] = "작업 이름" -- Needs review
|
||||
L["Operations"] = "작업" -- Needs review
|
||||
L["Options"] = "옵션"
|
||||
L["Other"] = "기타" -- Needs review
|
||||
L["Paste the search you'd like to import into the box below."] = "불러올 검색을 아래 상자에 붙여 넣으세요." -- Needs review
|
||||
L["Posted a %s with a buyuot of %s."] = "%s을(를) 즉시 구매가 %s에 등록하였습니다." -- Needs review
|
||||
L["Preparing Filter %d / %d"] = "필터 준비 중 %d / %d" -- Needs review
|
||||
L["Preparing filters..."] = "필터 준비 중..." -- Needs review
|
||||
L["Press Ctrl-C to copy this saved search."] = "Ctrl-C를 눌러서 저장된 검색을 복사하세요." -- Needs review
|
||||
L["Price"] = "가격" -- Needs review
|
||||
L["Quick Posting"] = "빠른 등록"
|
||||
L["Quick Posting Duration"] = "빠른 등록 기간" -- Needs review
|
||||
L["Quick Posting Price"] = "빠른 등록 가격" -- Needs review
|
||||
L["Recent Searches"] = "최근 검색"
|
||||
L["Relationships"] = "관계" -- Needs review
|
||||
L["Removed '%s' from your favorite searches."] = "즐겨찾기 검색에서 '%s'을(를) 제거하였습니다." -- Needs review
|
||||
L["Removed '%s' from your recent searches."] = "최근 검색에서 '%s'을(를) 제거하였습니다." -- Needs review
|
||||
L["Required Level Range:"] = "요구 레벨 범위" -- Needs review
|
||||
L["Reset Filters"] = "필터 리셋" -- Needs review
|
||||
L["Right-Click to favorite this recent search."] = "Right-Click으로 이 검색을 즐겨찾기에 등록합니다." -- Needs review
|
||||
L["Right-Click to remove from favorite searches."] = "Right-Click으로 츨겨찾기 검색에서 제거합니다." -- Needs review
|
||||
L["Saved Searches"] = "저장된 검색"
|
||||
L["Scanning %d / %d (Page %d / %d)"] = "검색 중 %d / %d (페이지 %d / %d)" -- Needs review
|
||||
L["Search Filter:"] = "검색 필터:" -- Needs review
|
||||
L["Select the groups which you would like to include in the search."] = "검색에 포함할 그룹을 선택하세요." -- Needs review
|
||||
L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = "'%s'은(는) 존재하지 않는 쇼핑 작업 '%s'을(를) 가지고 있습니다. 문제가 해결될 때까지 이 그룹은 무시됩니다." -- Needs review
|
||||
L["Shift-Left-Click to export this search."] = "Shift-Left-Click으로 이 검색을 내보냅니다." -- Needs review
|
||||
L["Shift-Right-Click to remove this recent search."] = "Shift-Right-Click으로 이 검색을 제거합니다." -- Needs review
|
||||
L["Shopping for auctions including those above the max price."] = "최대 가격 이상을 포함한 경매 쇼핑" -- Needs review
|
||||
L["Shopping for auctions with a max price set."] = "최대 가격 설정 경매 쇼핑" -- Needs review
|
||||
L["Shopping for even stacks including those above the max price"] = "최대 가격 이상을 포함한 맞춤 묶음 경매 쇼핑" -- Needs review
|
||||
L["Shopping for even stacks with a max price set."] = "최대 가격 설정 맞춤 묶음 쇼핑" -- Needs review
|
||||
L["Shopping operations contain settings items which you regularly buy from the auction house."] = "쇼핑 작업은 경매장에서 정기적으로 구매하는 아이템 설정을 포함하고 있습니다." -- Needs review
|
||||
L["Show Auctions Above Max Price"] = "최대 가격 이상의 경매 표시" -- Needs review
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
L["Sidebar Pages:"] = "부가 페이지:" -- Needs review
|
||||
L["Skipped the following search term because it's invalid."] = "다음 검색어는 유효하지 않으므로 건너뜁니다." -- Needs review
|
||||
L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = "검색어가 너무 길어서 건너뜁니다. 63글자 이상의 검색어는 블리자드에서 허용하지 않습니다."
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
L["Start Search"] = "검색 시작" -- Needs review
|
||||
-- L["Start Sniper"] = ""
|
||||
L["Start Vendor Search"] = "상점 검색 시작" -- Needs review
|
||||
L["Stop"] = "중지" -- Needs review
|
||||
-- L["Stop Sniper"] = ""
|
||||
L["% Target Value"] = "대상가격 %" -- Needs review
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
L["The duration at which items will be posted via the 'Quick Posting' frame."] = "'빠른 등록' 프레임을 통해서 아이템이 등록될 때 사용되는 게시 기간입니다." -- Needs review
|
||||
L["The highest price per item you will pay for items in affected by this operation."] = "이 작업에서 아이템당 지급할 수 있는 최고 금액입니다." -- Needs review
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
L["The vendor search looks for items on the AH below their vendor sell price."] = "상점 검색은 상점 판매 금액보다 낮은 경매장 물품을 검색합니다." -- Needs review
|
||||
L["This is how Shopping calculates the '% Market Value' column in the search results."] = "검색 결과에서 '시장가 %'를 계산하는 방법입니다." -- Needs review
|
||||
L["This is the default price Shopping will suggest to post items at when there's no others posted."] = "쇼핑에서 아이템을 등록할 때 경매장에 등록된 같은 아이템이 없다면 쇼핑은 여기서 지정한 가격을 제안합니다." -- Needs review
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = "쇼핑에서 아이템을 등록할 때 여기서 설정한 즉시 구매가의 백분율로 입찰 가격이 지정됩니다." -- Needs review
|
||||
L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = "'빠른 등록' 프레임을 통해서 등록할 아이템을 결정하는 가격입니다." -- Needs review
|
||||
L["TSM Groups"] = "TSM 그룹" -- Needs review
|
||||
L["Unknown Filter"] = "알수 없는 필터"
|
||||
L["Unknown milling search target: '%s'"] = "알수 없는 제분 검색 대상: '%s'" -- Needs review
|
||||
L["% Vendor Price"] = "상점가의 %"
|
||||
L["Vendor Search Profit: %s"] = "상인 검색 수익: %s" -- Needs review
|
||||
L["What to set the default undercut to when posting items with Shopping."] = "쇼핑에서 아이템을 등록할 때 사용할 기본 에누리 값을 설정하세요." -- Needs review
|
||||
L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = "추출 모드에서는 간단히 대상 아이템(잉크/안료, 마법부여 재료, 보석, 기타)을 검색 상자에 입력하면 이러한 아이템으로 추출될 수 있는 모든 아이템을 검색할 수 있습니다." -- Needs review
|
||||
L["When in normal mode, you may run simple and filtered searches of the auction house."] = "일반 모드에서는 간단하고 필터링 된 경매장 검색을 수행할 수 있습니다." -- Needs review
|
||||
@@ -0,0 +1,156 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - ptBR
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "ptBR")
|
||||
if not L then return end
|
||||
|
||||
L["Action"] = "Ação"
|
||||
L["Added '%s' to your favorite searches."] = "Adicionado '%s' para pesquisas favoritas."
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
L["Bid Percent"] = "Lance Percentual"
|
||||
L["Buyout"] = "Arremate"
|
||||
L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = [=[Click para procurar um item.
|
||||
Shift-Click para postar com valor de mercado.]=]
|
||||
L["Custom Filter"] = "Filtros" -- Needs review
|
||||
L["Default Post Undercut Amount"] = "Post com valor de corte padrão "
|
||||
L["Destroy Mode"] = "Modo destruir"
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
L["Done Scanning"] = "Escaneamento concluído"
|
||||
L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = "Digite o que você quer procurar no campo abaixo. Você pode também usar as seguintes opções para pesquisas mais complexas."
|
||||
L["Error creating operation. Operation with name '%s' already exists."] = "Erro ao criar operação. Operação com o nome '%s' já existe."
|
||||
L["Even (5/10/15/20) Stacks Only"] = "Apenas pilhas de (5/10/15/20)"
|
||||
L["Favorite Searches"] = "Pesquisas favoritas"
|
||||
L["General"] = "Geral"
|
||||
L["General Operation Options"] = "Opções gerais de operação"
|
||||
L["General Options"] = "Opções Gerais"
|
||||
L["General Settings"] = "Configurações gerais"
|
||||
L["Give the new operation a name. A descriptive name will help you find this operation later."] = "Dê um nome a nova operação. Um nome descritivo irá ajudá-lo a encontrar esta operação mais tarde."
|
||||
L["Hide Grouped Items"] = "Esconder itens agrupados"
|
||||
L["If checked, auctions above the max price will be shown."] = "Se marcado, leilões acima do preço máximo serão mostradas."
|
||||
L["If checked, only auctions posted in even quantities will be considered for purchasing."] = "Se marcada, somente leilões postados nas mesmas quantidades serão consideradas para compra."
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
L["If set, only items which are usable by your character will be included in the results."] = "Se definido, apenas os itens que são utilizáveis por seu personagem serão incluídos nos resultados."
|
||||
L["If set, only items which exactly match the search filter you have set will be included in the results."] = "Se definido, apenas os itens que correspondem exatamente ao filtro de pesquisa que você definiu serão incluído nos resultados."
|
||||
L["Import"] = "Importar"
|
||||
L["Import Favorite Search"] = "Importar pesquisas favoritas"
|
||||
L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = "Filtro deLinhas:|r Você pode facilmente adicionar filtros de pesquisa comuns à sua pesquisa, como raridade, nível e tipo de item. Exemplo '%s85/90/i350/i553/Armadura/Couro/Épico|r' irá procurar por todas armaduras de couro épicas que requerem nível entre entre 85 e 90, e tenham ilvl entre 350 e 553. Ou '%sRubi Infernal/exact|r' irá mostrar apenas minérios de Rubis Infernais."
|
||||
L["Invalid custom price source for %s. %s"] = "Fonte de preço personalizado pra %s inválido. %s"
|
||||
L["Invalid destroy search: '%s'"] = "Pesquisa destrutiva inválida: '%s'"
|
||||
L["Invalid destroy target: '%s'"] = "Destruir alvo inválido: '%s'"
|
||||
L["Invalid Even Only Filter"] = "'Mesmo filtro apenas' inválido" -- Needs review
|
||||
L["Invalid Exact Only Filter"] = "Filtro exato inválido" -- Needs review
|
||||
L["Invalid Filter"] = "Filtro inválido"
|
||||
L["Invalid Item Level"] = "Nível do item inválido"
|
||||
L["Invalid Item Rarity"] = "Raridade do item Inválido"
|
||||
L["Invalid Item SubType"] = "Subtipo do item inválido"
|
||||
L["Invalid Item Type"] = "Tipo de item inválido"
|
||||
L["Invalid Max Quantity"] = "Quantidade máxima inválida."
|
||||
L["Invalid Min Level"] = "Nível mínimo inválido"
|
||||
L["Invalid target item for destroy search: '%s'"] = "item alvo para procura destrutiva inválido: '%s'"
|
||||
L["Invalid Usable Only Filter"] = "Filtro 'item usável' inválido" -- Needs review
|
||||
L["Item"] = "Item"
|
||||
L["Item Class"] = "Classe de item"
|
||||
L["Item Level Range:"] = "Intervalo de nível do item" -- Needs review
|
||||
L["Item SubClass"] = "Subclasse do item" -- Needs review
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
L["Left-Click to run this search."] = "Click-esquerdo para executar esta pesquisa" -- Needs review
|
||||
L["Log"] = "Log" -- Needs review
|
||||
-- L["Management"] = ""
|
||||
L["% Market Value"] = "% do Valor de Mercado"
|
||||
L["Market Value Price Source"] = "Fonte de preço: Valor de mercado" -- Needs review
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
L["Maximum Auction Price (per item)"] = "Preço máximo do leilão (por item)" -- Needs review
|
||||
L["Maximum quantity purchased for destroy search."] = "Quantidade máxima comprada para pesquisa destrutiva." -- Needs review
|
||||
L["Maximum quantity purchased for %s."] = "Quantidade máxima comprada por %s" -- Needs review
|
||||
L["Maximum Quantity to Buy:"] = "Quantidade máxima de compra:" -- Needs review
|
||||
L["% Max Price"] = "% do Preço Máx"
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
L["Minimum Rarity"] = "Raridade mínima" -- Needs review
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
L["New Operation"] = "Nova operação" -- Needs review
|
||||
L["No recent AuctionDB scan data found."] = "Nenhum dado de pesquisa LeilãoDB recente encontrado." -- Needs review
|
||||
L["Normal Mode"] = "Modo Normal" -- Needs review
|
||||
L["Normal Post Price"] = "Preço de post normal" -- Needs review
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
L["Num"] = "Num." -- Needs review
|
||||
L["Operation Name"] = "Nome da operação" -- Needs review
|
||||
L["Operations"] = "Operações" -- Needs review
|
||||
L["Options"] = "Opções"
|
||||
L["Other"] = "Outros" -- Needs review
|
||||
L["Paste the search you'd like to import into the box below."] = "Cole a pesquisa que você gostaria de importar na caixa abaixo." -- Needs review
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
L["Preparing Filter %d / %d"] = "Preparando filtro %d / %d" -- Needs review
|
||||
L["Preparing filters..."] = "Preparando filtros..." -- Needs review
|
||||
L["Press Ctrl-C to copy this saved search."] = "Pressione Ctrl-C para copiar esta pesquisa salva" -- Needs review
|
||||
L["Price"] = "Preço" -- Needs review
|
||||
L["Quick Posting"] = "Post rápido"
|
||||
L["Quick Posting Duration"] = "Duração de postagem rápida" -- Needs review
|
||||
L["Quick Posting Price"] = "Preço de postagem rápida" -- Needs review
|
||||
L["Recent Searches"] = "Pesquisas recentes"
|
||||
L["Relationships"] = "Relacionamentos" -- Needs review
|
||||
L["Removed '%s' from your favorite searches."] = "Removido '%s' de suas pesquisas favoritas." -- Needs review
|
||||
L["Removed '%s' from your recent searches."] = "Removido '%s' de suas pesquisas recentes." -- Needs review
|
||||
L["Required Level Range:"] = "Intervalo de nível requerido:" -- Needs review
|
||||
L["Reset Filters"] = "Redefinir filtros" -- Needs review
|
||||
L["Right-Click to favorite this recent search."] = "Click-Direito para favoritar esta pesquisa recente" -- Needs review
|
||||
L["Right-Click to remove from favorite searches."] = "Click-Direito para remover das pesquisas favoritas." -- Needs review
|
||||
L["Saved Searches"] = "Pesquisas salvas"
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
L["Search Filter:"] = "Filtro de pesquisa:" -- Needs review
|
||||
L["Select the groups which you would like to include in the search."] = "Selecione os grupos que você gostaria de incluir na pesquisa." -- Needs review
|
||||
L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = "'%s' tem uma operação de compra de '%s' que não existe mais. Shopping irá ignorar este grupo até que isso seja corrigido."
|
||||
L["Shift-Left-Click to export this search."] = "Shift-Click-Esquerdo para exportar esta pesquisa." -- Needs review
|
||||
L["Shift-Right-Click to remove this recent search."] = "Shift-Click-Direito para remover esta pesquisa recente." -- Needs review
|
||||
L["Shopping for auctions including those above the max price."] = "Compras de leilões incluindo aqueles acima do preço máximo." -- Needs review
|
||||
L["Shopping for auctions with a max price set."] = "Compras de leilões com um preço máximo definido." -- Needs review
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
L["Skipped the following search term because it's invalid."] = "Pulado o seguinte termo de pesquisa, porque é inválido."
|
||||
L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = "Pulado o seguinte termo de pesquisa, pois é muito longo. Blizzard não permite termos de pesquisa com mais de 63 caracteres."
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
L["Start Search"] = "Iniciar pesquisa" -- Needs review
|
||||
-- L["Start Sniper"] = ""
|
||||
L["Start Vendor Search"] = "Iniciar pesquisa de vendedor" -- Needs review
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
L["% Target Value"] = "% do valor alvo"
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
L["Unknown Filter"] = "Filtro desconhecido"
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
L["% Vendor Price"] = "% de preço de vendedor "
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
-- L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = ""
|
||||
-- L["When in normal mode, you may run simple and filtered searches of the auction house."] = ""
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - ruRU
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "ruRU")
|
||||
if not L then return end
|
||||
|
||||
L["Action"] = "действие" -- Needs review
|
||||
L["Added '%s' to your favorite searches."] = "Добавлено '%s' для избранного поиска." -- Needs review
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
L["Bid Percent"] = "Процент ставки"
|
||||
L["Buyout"] = "Выкуп"
|
||||
L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = [=[Нажмите эту кнопку для поиска элемента.
|
||||
Shift + клик пост по рыночной стоимости.]=] -- Needs review
|
||||
L["Custom Filter"] = "Пользовательский Фильтр" -- Needs review
|
||||
-- L["Default Post Undercut Amount"] = ""
|
||||
L["Destroy Mode"] = "режим уничтожения" -- Needs review
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
L["Done Scanning"] = "Сканирование завершено" -- Needs review
|
||||
L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = "Введите то, что вы хотите найти в это поле. Вы также можете использовать следующие опции для более сложные запросы." -- Needs review
|
||||
-- L["Error creating operation. Operation with name '%s' already exists."] = ""
|
||||
-- L["Even (5/10/15/20) Stacks Only"] = ""
|
||||
L["Favorite Searches"] = "Любимые поиски" -- Needs review
|
||||
L["General"] = "Основной" -- Needs review
|
||||
L["General Operation Options"] = "Настройка основных операций" -- Needs review
|
||||
L["General Options"] = "Общие настройки"
|
||||
-- L["General Settings"] = ""
|
||||
L["Give the new operation a name. A descriptive name will help you find this operation later."] = "Дать имя новой операции. Описательное имя поможет вам найти эту операцию позже." -- Needs review
|
||||
-- L["Hide Grouped Items"] = ""
|
||||
-- L["If checked, auctions above the max price will be shown."] = ""
|
||||
-- L["If checked, only auctions posted in even quantities will be considered for purchasing."] = ""
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
-- L["If set, only items which are usable by your character will be included in the results."] = ""
|
||||
-- L["If set, only items which exactly match the search filter you have set will be included in the results."] = ""
|
||||
-- L["Import"] = ""
|
||||
-- L["Import Favorite Search"] = ""
|
||||
-- L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = ""
|
||||
-- L["Invalid custom price source for %s. %s"] = ""
|
||||
-- L["Invalid destroy search: '%s'"] = ""
|
||||
-- L["Invalid destroy target: '%s'"] = ""
|
||||
-- L["Invalid Even Only Filter"] = ""
|
||||
-- L["Invalid Exact Only Filter"] = ""
|
||||
L["Invalid Filter"] = "Недействительный фильтр" -- Needs review
|
||||
L["Invalid Item Level"] = "Недействительный уровень предмета"
|
||||
L["Invalid Item Rarity"] = "Недействительное качество предмета"
|
||||
-- L["Invalid Item SubType"] = ""
|
||||
L["Invalid Item Type"] = "Неверный тип товара" -- Needs review
|
||||
-- L["Invalid Max Quantity"] = ""
|
||||
L["Invalid Min Level"] = "Недействительный минимальный уровень"
|
||||
-- L["Invalid target item for destroy search: '%s'"] = ""
|
||||
-- L["Invalid Usable Only Filter"] = ""
|
||||
L["Item"] = "Предмет"
|
||||
-- L["Item Class"] = ""
|
||||
-- L["Item Level Range:"] = ""
|
||||
-- L["Item SubClass"] = ""
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
-- L["Left-Click to run this search."] = ""
|
||||
-- L["Log"] = ""
|
||||
-- L["Management"] = ""
|
||||
L["% Market Value"] = "% рыноч. цены"
|
||||
-- L["Market Value Price Source"] = ""
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
-- L["Maximum Auction Price (per item)"] = ""
|
||||
-- L["Maximum quantity purchased for destroy search."] = ""
|
||||
-- L["Maximum quantity purchased for %s."] = ""
|
||||
-- L["Maximum Quantity to Buy:"] = ""
|
||||
L["% Max Price"] = "% макс. цены"
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
-- L["Minimum Rarity"] = ""
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
L["New Operation"] = "Новая Операция"
|
||||
-- L["No recent AuctionDB scan data found."] = ""
|
||||
-- L["Normal Mode"] = ""
|
||||
-- L["Normal Post Price"] = ""
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
-- L["Num"] = ""
|
||||
-- L["Operation Name"] = ""
|
||||
-- L["Operations"] = ""
|
||||
L["Options"] = "Настройки"
|
||||
-- L["Other"] = ""
|
||||
-- L["Paste the search you'd like to import into the box below."] = ""
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
-- L["Preparing Filter %d / %d"] = ""
|
||||
-- L["Preparing filters..."] = ""
|
||||
-- L["Press Ctrl-C to copy this saved search."] = ""
|
||||
-- L["Price"] = ""
|
||||
L["Quick Posting"] = "Быстрое размещение" -- Needs review
|
||||
-- L["Quick Posting Duration"] = ""
|
||||
-- L["Quick Posting Price"] = ""
|
||||
L["Recent Searches"] = "Недавние поиски" -- Needs review
|
||||
-- L["Relationships"] = ""
|
||||
-- L["Removed '%s' from your favorite searches."] = ""
|
||||
-- L["Removed '%s' from your recent searches."] = ""
|
||||
-- L["Required Level Range:"] = ""
|
||||
-- L["Reset Filters"] = ""
|
||||
-- L["Right-Click to favorite this recent search."] = ""
|
||||
-- L["Right-Click to remove from favorite searches."] = ""
|
||||
L["Saved Searches"] = "Сохраненные поиски" -- Needs review
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
-- L["Search Filter:"] = ""
|
||||
-- L["Select the groups which you would like to include in the search."] = ""
|
||||
L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = "\"% s \" имеет Торговые операции '%s', которая больше не существует. Торговые будете игнорировать эту группу до тех пор, пока это будет Исправлено." -- Needs review
|
||||
-- L["Shift-Left-Click to export this search."] = ""
|
||||
-- L["Shift-Right-Click to remove this recent search."] = ""
|
||||
-- L["Shopping for auctions including those above the max price."] = ""
|
||||
-- L["Shopping for auctions with a max price set."] = ""
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
-- L["Skipped the following search term because it's invalid."] = ""
|
||||
-- L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = ""
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
-- L["Start Search"] = ""
|
||||
-- L["Start Sniper"] = ""
|
||||
-- L["Start Vendor Search"] = ""
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
L["% Target Value"] = "% стоимость выделенного" -- Needs review
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
L["Unknown Filter"] = "Фильтр не указан" -- Needs review
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
L["% Vendor Price"] = "% цена торговца" -- Needs review
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
-- L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = ""
|
||||
-- L["When in normal mode, you may run simple and filtered searches of the auction house."] = ""
|
||||
@@ -0,0 +1,156 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - zhCN
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "zhCN")
|
||||
if not L then return end
|
||||
|
||||
L["Action"] = "功能"
|
||||
L["Added '%s' to your favorite searches."] = "添加'%s'到你最喜欢的搜索"
|
||||
L["Below Custom Price ('0c' to disable)"] = "低于用户价格(忽略“0C”)" -- Needs review
|
||||
L["Below Max Price"] = "低于最高价" -- Needs review
|
||||
L["Below Vendor Sell Price"] = "低于贩卖价" -- Needs review
|
||||
L["Bid Percent"] = "竞价百分比"
|
||||
L["Buyout"] = "一口价"
|
||||
L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = [=[单击物品 将扫描拍卖
|
||||
Shift+单击 将以列出的市场价格来发布拍卖]=]
|
||||
L["Custom Filter"] = "自定义筛选器"
|
||||
L["Default Post Undercut Amount"] = "默认发布压价金额"
|
||||
L["Destroy Mode"] = "分解模式"
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
L["Done Scanning"] = "完成扫描"
|
||||
L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = "在此框中输入你想要搜索的物品,您还可以使用下列选项来进行更复杂精确的搜索"
|
||||
L["Error creating operation. Operation with name '%s' already exists."] = "创建操作失败。操作名称 '%s' 已经存在。"
|
||||
L["Even (5/10/15/20) Stacks Only"] = "只买成(5/10/15/20)的堆叠"
|
||||
L["Favorite Searches"] = "最喜欢的搜索"
|
||||
L["General"] = "常规"
|
||||
L["General Operation Options"] = "常规操作选项"
|
||||
L["General Options"] = "常规选项"
|
||||
L["General Settings"] = "常规设置"
|
||||
L["Give the new operation a name. A descriptive name will help you find this operation later."] = "给新的操作命名。这个命名将提示帮助你之后更容易找到这个操作。"
|
||||
L["Hide Grouped Items"] = "隐藏分组项目"
|
||||
L["If checked, auctions above the max price will be shown."] = "如果勾选,将显示高于最高价格的拍卖品。"
|
||||
L["If checked, only auctions posted in even quantities will be considered for purchasing."] = "如果勾选, 只有数量合适的发布物品才会考虑购买"
|
||||
L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = "如果勾选,每件物品最大购买价格将显示在提示栏" -- Needs review
|
||||
L["If set, only items which are usable by your character will be included in the results."] = "如果设置,只有对你角色可用的物品将在结果中显示。"
|
||||
L["If set, only items which exactly match the search filter you have set will be included in the results."] = "如果设置, 只有严格匹配你设置的筛选条件的物品才会被显示在结果中。"
|
||||
L["Import"] = "导入"
|
||||
L["Import Favorite Search"] = "导入最喜欢的搜索"
|
||||
L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = "|cffffff00在线过滤:|r 你可以通过添加 稀有度,等级,物品类型 来过滤物品. 例如 '%sarmor/leather/epic/85/i350/i377|r' 将会查找所有皮甲并且满足(史诗级,85级,物品等级在355~377. 再如, '%sinferno ruby/exact|r' 将只会显示原始的地狱炎石而不包括切割后的产品"
|
||||
L["Invalid custom price source for %s. %s"] = "无效的价格来源%s. %s"
|
||||
L["Invalid destroy search: '%s'"] = "无效分解搜索: '%s'"
|
||||
L["Invalid destroy target: '%s'"] = "无效分解目标: '%s'"
|
||||
L["Invalid Even Only Filter"] = "无效唯一筛选"
|
||||
L["Invalid Exact Only Filter"] = "无效的唯一精确筛选"
|
||||
L["Invalid Filter"] = "无效筛选"
|
||||
L["Invalid Item Level"] = "无效的物品等级"
|
||||
L["Invalid Item Rarity"] = "无效的物品品质"
|
||||
L["Invalid Item SubType"] = "无效的物品子类型"
|
||||
L["Invalid Item Type"] = "无效物品类型"
|
||||
L["Invalid Max Quantity"] = "无效的最大数量"
|
||||
L["Invalid Min Level"] = "无效的最低等级"
|
||||
L["Invalid target item for destroy search: '%s'"] = "分解搜索中的无效物品: '%s'"
|
||||
L["Invalid Usable Only Filter"] = "无效的唯一可用筛选"
|
||||
L["Item"] = "物品"
|
||||
L["Item Class"] = "物品种类"
|
||||
L["Item Level Range:"] = "物品等级范围:"
|
||||
L["Item SubClass"] = "物品子类型"
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
L["Left-Click to run this search."] = "左键点击来进行这个搜索"
|
||||
L["Log"] = "日志"
|
||||
L["Management"] = [=[Management
|
||||
]=] -- Needs review
|
||||
L["% Market Value"] = "%s 市场价"
|
||||
L["Market Value Price Source"] = "市场价来源"
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
L["Maximum Auction Price (per item)"] = "最高价(每件)"
|
||||
L["Maximum quantity purchased for destroy search."] = "分解搜索的最大购买数量"
|
||||
L["Maximum quantity purchased for %s."] = "%s 的最大购买数量"
|
||||
L["Maximum Quantity to Buy:"] = "最大购买量"
|
||||
L["% Max Price"] = "%最高价"
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
L["Minimum Rarity"] = "最低品质"
|
||||
L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = "|cffffff00多重查询条件:|r 你可以一次查询多个物品通过使用';'符号分割开来. 例如 '%s铁矿石; 铜矿石|r' 将会同时查找铁矿石和铜矿石。"
|
||||
L["New Operation"] = "新操作"
|
||||
L["No recent AuctionDB scan data found."] = "没有发现最近的 AuctionDB扫描数据"
|
||||
L["Normal Mode"] = "正常模式"
|
||||
L["Normal Post Price"] = "回跌价格"
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
L["Num"] = "数量"
|
||||
L["Operation Name"] = "操作名称"
|
||||
L["Operations"] = "操作"
|
||||
L["Options"] = "选项"
|
||||
L["Other"] = "其他"
|
||||
L["Paste the search you'd like to import into the box below."] = "在下面的框体粘贴导入你想要的搜索"
|
||||
L["Posted a %s with a buyuot of %s."] = "以一口价 %s, 发布拍卖 %s."
|
||||
L["Preparing Filter %d / %d"] = "准备筛选器 %d / %d"
|
||||
L["Preparing filters..."] = "准备筛选…"
|
||||
L["Press Ctrl-C to copy this saved search."] = "Ctrl+C复制这个保存的搜索"
|
||||
L["Price"] = "价格"
|
||||
L["Quick Posting"] = "快速拍卖"
|
||||
L["Quick Posting Duration"] = "快速拍卖持续时间"
|
||||
L["Quick Posting Price"] = "快速拍卖价格"
|
||||
L["Recent Searches"] = "最近搜索"
|
||||
L["Relationships"] = "关联"
|
||||
L["Removed '%s' from your favorite searches."] = "从您最喜欢的搜索里移除'%s' "
|
||||
L["Removed '%s' from your recent searches."] = "从您最近的搜索里移除'%s' "
|
||||
L["Required Level Range:"] = "物品等级范围:"
|
||||
L["Reset Filters"] = "重置筛选器"
|
||||
L["Right-Click to favorite this recent search."] = "右键点击 保存到最喜欢的搜索"
|
||||
L["Right-Click to remove from favorite searches."] = "右键点击 从最喜欢的搜索里移除"
|
||||
L["Saved Searches"] = "保存搜索"
|
||||
L["Scanning %d / %d (Page %d / %d)"] = "扫描 %d / %d(页面 %d / %d)"
|
||||
L["Search Filter:"] = "搜索筛选器:"
|
||||
L["Select the groups which you would like to include in the search."] = "选择你想搜索的分组"
|
||||
L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = "分组'%s'(包含操作 '%s')已不再存在. Shopping会忽略这个分组直到该问题被修复。"
|
||||
L["Shift-Left-Click to export this search."] = "Shift+左键 导出这个搜索。"
|
||||
L["Shift-Right-Click to remove this recent search."] = "Shift+右键 移除最近的搜索。"
|
||||
L["Shopping for auctions including those above the max price."] = "购买拍卖品(包括那些高于最高价格的)。"
|
||||
L["Shopping for auctions with a max price set."] = "购买拍卖品(在最高价格限定下)。"
|
||||
L["Shopping for even stacks including those above the max price"] = "购买整组,忽视最高价格选定。"
|
||||
L["Shopping for even stacks with a max price set."] = "购买整组,在最高价格限定下。"
|
||||
L["Shopping operations contain settings items which you regularly buy from the auction house."] = "Shopping操作包括设置你经常在拍卖行购买的物品"
|
||||
L["Show Auctions Above Max Price"] = "显示高于最高价格的拍卖品"
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
L["Sidebar Pages:"] = "侧边拦页面:"
|
||||
L["Skipped the following search term because it's invalid."] = "已跳过下一不可用的扫描。"
|
||||
L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = "跳过下面的搜索项,因为它太长了。暴雪不允许超过63字符的搜索条件。"
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
L["Start Search"] = "开始搜索"
|
||||
-- L["Start Sniper"] = ""
|
||||
L["Start Vendor Search"] = "开始NPC价格查询"
|
||||
L["Stop"] = "停止"
|
||||
-- L["Stop Sniper"] = ""
|
||||
L["% Target Value"] = "% 目标物品价格"
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
L["The duration at which items will be posted via the 'Quick Posting' frame."] = "物品通过'快速发布'模块发布的时长"
|
||||
L["The highest price per item you will pay for items in affected by this operation."] = "你希望购买每件物品的最高价(不是每组的价格),拍卖行中所有低于此价格的物品将会提示你购买"
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
L["The vendor search looks for items on the AH below their vendor sell price."] = "NPC价格查询将查询那些可以转手卖NPC来获取利益的物品"
|
||||
L["This is how Shopping calculates the '% Market Value' column in the search results."] = "这是快速拍卖模块物品市场价的来源,通常显示在模块里物品的右侧"
|
||||
L["This is the default price Shopping will suggest to post items at when there's no others posted."] = "这是当没有别的出售者出售该物品时,将以回跌价出售上架该物品"
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = "这是你发布物品的竞标价和一口价百分比。"
|
||||
L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = "这个价格关系着在'快速发布'模块里用shift+点击发布物品的价格。"
|
||||
L["TSM Groups"] = "TSM分组"
|
||||
L["Unknown Filter"] = "未知的筛选"
|
||||
L["Unknown milling search target: '%s'"] = "未知研磨目标'%s'"
|
||||
L["% Vendor Price"] = "% NPC价格"
|
||||
L["Vendor Search Profit: %s"] = "供应商价格: %s"
|
||||
L["What to set the default undercut to when posting items with Shopping."] = "设置发布和购买的默认削价"
|
||||
L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = "在分解模式,当你在搜索框中输入一个物品名称 (墨水/染料, 附魔材料, 宝石, 等等)时,会出现能分解出这种物品的全部物品。"
|
||||
L["When in normal mode, you may run simple and filtered searches of the auction house."] = "在正常模式下,你可以在拍卖行进行简单筛选的搜索。"
|
||||
@@ -0,0 +1,154 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- TradeSkillMaster_Shopping Locale - zhTW
|
||||
-- Please use the localization app on CurseForge to update this
|
||||
-- http://wow.curseforge.com/addons/TradeSkillMaster_Shopping/localization/
|
||||
|
||||
local L = LibStub("AceLocale-3.0"):NewLocale("TradeSkillMaster_Shopping", "zhTW")
|
||||
if not L then return end
|
||||
|
||||
-- L["Action"] = ""
|
||||
-- L["Added '%s' to your favorite searches."] = ""
|
||||
-- L["Below Custom Price ('0c' to disable)"] = ""
|
||||
-- L["Below Max Price"] = ""
|
||||
-- L["Below Vendor Sell Price"] = ""
|
||||
L["Bid Percent"] = "競標百分比"
|
||||
-- L["Buyout"] = ""
|
||||
--[==[ L[ [=[Click to search for an item.
|
||||
Shift-Click to post at market value.]=] ] = "" ]==]
|
||||
-- L["Custom Filter"] = ""
|
||||
-- L["Default Post Undercut Amount"] = ""
|
||||
-- L["Destroy Mode"] = ""
|
||||
-- L["% DE Value"] = ""
|
||||
-- L["Disenchant Search Profit: %s"] = ""
|
||||
-- L["Done Scanning"] = ""
|
||||
-- L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."] = ""
|
||||
-- L["Error creating operation. Operation with name '%s' already exists."] = ""
|
||||
-- L["Even (5/10/15/20) Stacks Only"] = ""
|
||||
-- L["Favorite Searches"] = ""
|
||||
-- L["General"] = ""
|
||||
-- L["General Operation Options"] = ""
|
||||
L["General Options"] = "一般設定"
|
||||
-- L["General Settings"] = ""
|
||||
-- L["Give the new operation a name. A descriptive name will help you find this operation later."] = ""
|
||||
-- L["Hide Grouped Items"] = ""
|
||||
-- L["If checked, auctions above the max price will be shown."] = ""
|
||||
-- L["If checked, only auctions posted in even quantities will be considered for purchasing."] = ""
|
||||
-- L["If checked, the maximum shopping price will be shown in the tooltip for the item."] = ""
|
||||
-- L["If set, only items which are usable by your character will be included in the results."] = ""
|
||||
-- L["If set, only items which exactly match the search filter you have set will be included in the results."] = ""
|
||||
-- L["Import"] = ""
|
||||
-- L["Import Favorite Search"] = ""
|
||||
-- L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/85/i350/i377|r' will search for all leather armor of epic quality that requires level 85 and has an ilvl between 350 and 377 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."] = ""
|
||||
-- L["Invalid custom price source for %s. %s"] = ""
|
||||
-- L["Invalid destroy search: '%s'"] = ""
|
||||
-- L["Invalid destroy target: '%s'"] = ""
|
||||
-- L["Invalid Even Only Filter"] = ""
|
||||
L["Invalid Exact Only Filter"] = "無效精確過濾"
|
||||
L["Invalid Filter"] = "無效過濾"
|
||||
L["Invalid Item Level"] = "無效物品等級"
|
||||
L["Invalid Item Rarity"] = "無效物品稀有"
|
||||
L["Invalid Item SubType"] = "無效物品次分類"
|
||||
L["Invalid Item Type"] = "無效物品類型"
|
||||
-- L["Invalid Max Quantity"] = ""
|
||||
L["Invalid Min Level"] = "無效最低等級"
|
||||
-- L["Invalid target item for destroy search: '%s'"] = ""
|
||||
L["Invalid Usable Only Filter"] = "無校可使用過濾"
|
||||
L["Item"] = "物品"
|
||||
-- L["Item Class"] = ""
|
||||
-- L["Item Level Range:"] = ""
|
||||
-- L["Item SubClass"] = ""
|
||||
-- L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below their vendor sell price will be displayed in Sniper searches."] = ""
|
||||
-- L["Items which are below this custom price will be displayed in Sniper searches."] = ""
|
||||
-- L["Left-Click to run this search."] = ""
|
||||
-- L["Log"] = ""
|
||||
-- L["Management"] = ""
|
||||
L["% Market Value"] = "%市場價格"
|
||||
-- L["Market Value Price Source"] = ""
|
||||
-- L["% Mat Price"] = ""
|
||||
-- L["Max Disenchant Search Percent"] = ""
|
||||
-- L["Maximum Auction Price (per item)"] = ""
|
||||
-- L["Maximum quantity purchased for destroy search."] = ""
|
||||
-- L["Maximum quantity purchased for %s."] = ""
|
||||
-- L["Maximum Quantity to Buy:"] = ""
|
||||
L["% Max Price"] = "%最大價格"
|
||||
-- L["Max Shopping Price:"] = ""
|
||||
-- L["Minimum Rarity"] = ""
|
||||
-- L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%selementium ore; obsidium ore|r' will search for both elementium and obsidium ore."] = ""
|
||||
-- L["New Operation"] = ""
|
||||
-- L["No recent AuctionDB scan data found."] = ""
|
||||
-- L["Normal Mode"] = ""
|
||||
-- L["Normal Post Price"] = ""
|
||||
-- L["NOTE: The scan must be stopped before you can buy anything."] = ""
|
||||
-- L["Num"] = ""
|
||||
-- L["Operation Name"] = ""
|
||||
-- L["Operations"] = ""
|
||||
L["Options"] = "設定"
|
||||
-- L["Other"] = ""
|
||||
-- L["Paste the search you'd like to import into the box below."] = ""
|
||||
-- L["Posted a %s with a buyuot of %s."] = ""
|
||||
-- L["Preparing Filter %d / %d"] = ""
|
||||
-- L["Preparing filters..."] = ""
|
||||
-- L["Press Ctrl-C to copy this saved search."] = ""
|
||||
-- L["Price"] = ""
|
||||
L["Quick Posting"] = "快速發佈"
|
||||
-- L["Quick Posting Duration"] = ""
|
||||
-- L["Quick Posting Price"] = ""
|
||||
L["Recent Searches"] = "最近搜尋"
|
||||
-- L["Relationships"] = ""
|
||||
-- L["Removed '%s' from your favorite searches."] = ""
|
||||
-- L["Removed '%s' from your recent searches."] = ""
|
||||
-- L["Required Level Range:"] = ""
|
||||
-- L["Reset Filters"] = ""
|
||||
-- L["Right-Click to favorite this recent search."] = ""
|
||||
-- L["Right-Click to remove from favorite searches."] = ""
|
||||
L["Saved Searches"] = "已儲存搜尋"
|
||||
-- L["Scanning %d / %d (Page %d / %d)"] = ""
|
||||
-- L["Search Filter:"] = ""
|
||||
-- L["Select the groups which you would like to include in the search."] = ""
|
||||
-- L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."] = ""
|
||||
-- L["Shift-Left-Click to export this search."] = ""
|
||||
-- L["Shift-Right-Click to remove this recent search."] = ""
|
||||
-- L["Shopping for auctions including those above the max price."] = ""
|
||||
-- L["Shopping for auctions with a max price set."] = ""
|
||||
-- L["Shopping for even stacks including those above the max price"] = ""
|
||||
-- L["Shopping for even stacks with a max price set."] = ""
|
||||
-- L["Shopping operations contain settings items which you regularly buy from the auction house."] = ""
|
||||
-- L["Show Auctions Above Max Price"] = ""
|
||||
-- L["Show Shopping Max Price in Tooltip"] = ""
|
||||
-- L["Sidebar Pages:"] = ""
|
||||
L["Skipped the following search term because it's invalid."] = "略過以下搜尋條件因為是無效的。"
|
||||
L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."] = "因為太長略過以下搜尋條件。暴雪不允許搜尋條件超過63字元。"
|
||||
-- L["Sniper Options"] = ""
|
||||
-- L["Start Disenchant Search"] = ""
|
||||
-- L["Start Search"] = ""
|
||||
-- L["Start Sniper"] = ""
|
||||
-- L["Start Vendor Search"] = ""
|
||||
-- L["Stop"] = ""
|
||||
-- L["Stop Sniper"] = ""
|
||||
-- L["% Target Value"] = ""
|
||||
-- L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"] = ""
|
||||
-- L["The duration at which items will be posted via the 'Quick Posting' frame."] = ""
|
||||
-- L["The highest price per item you will pay for items in affected by this operation."] = ""
|
||||
-- L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."] = ""
|
||||
-- L["The vendor search looks for items on the AH below their vendor sell price."] = ""
|
||||
-- L["This is how Shopping calculates the '% Market Value' column in the search results."] = ""
|
||||
-- L["This is the default price Shopping will suggest to post items at when there's no others posted."] = ""
|
||||
-- L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."] = ""
|
||||
-- L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."] = ""
|
||||
-- L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."] = ""
|
||||
-- L["TSM Groups"] = ""
|
||||
L["Unknown Filter"] = "未知過濾"
|
||||
-- L["Unknown milling search target: '%s'"] = ""
|
||||
L["% Vendor Price"] = "%商人價格"
|
||||
-- L["Vendor Search Profit: %s"] = ""
|
||||
-- L["What to set the default undercut to when posting items with Shopping."] = ""
|
||||
-- L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."] = ""
|
||||
-- L["When in normal mode, you may run simple and filtered searches of the auction house."] = ""
|
||||
@@ -0,0 +1,158 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
local TSM = select(2, ...)
|
||||
TSM = LibStub("AceAddon-3.0"):NewAddon(TSM, "TSM_Shopping", "AceEvent-3.0", "AceConsole-3.0")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
local savedDBDefaults = {
|
||||
global = {
|
||||
optionsTreeStatus = {},
|
||||
previousSearches = {},
|
||||
treeGroupStatus = {},
|
||||
favoriteSearches = {},
|
||||
normalPostPrice = "150% dbmarket",
|
||||
postBidPercent = 0.95,
|
||||
quickPostingPrice = "100% dbmarket",
|
||||
quickPostingDuration = 2,
|
||||
quickPostingHideGrouped = true,
|
||||
sidebarBtn = 1,
|
||||
postUndercut = 1,
|
||||
marketValueSource = "dbmarket",
|
||||
destroyingTargetItems = {},
|
||||
tooltip = true,
|
||||
minDeSearchLvl = 1,
|
||||
maxDeSearchLvl = 600,
|
||||
maxDeSearchPercent = 1,
|
||||
sniperVendorPrice = true,
|
||||
sniperMaxPrice = true,
|
||||
sniperCustomPrice = "0c",
|
||||
},
|
||||
}
|
||||
|
||||
function TSM:OnInitialize()
|
||||
TSM.db = LibStub("AceDB-3.0"):New("TradeSkillMaster_ShoppingDB", savedDBDefaults)
|
||||
|
||||
for name, module in pairs(TSM.modules) do
|
||||
TSM[name] = module
|
||||
end
|
||||
TSMAPI.AuctionControl.undercut = TSM.db.global.postUndercut
|
||||
|
||||
-- register with TSM
|
||||
TSM:RegisterModule()
|
||||
|
||||
TSM.db.profile.dealfinding = nil
|
||||
TSM.db.global.appInfo = nil
|
||||
end
|
||||
|
||||
-- registers this module with TSM by first setting all fields and then calling TSMAPI:NewModule().
|
||||
function TSM:RegisterModule()
|
||||
TSM.operations = { maxOperations = 1, callbackOptions = "Options:Load", callbackInfo = "GetOperationInfo" }
|
||||
TSM.auctionTab = { callbackShow = "Search:Show", callbackHide = "Search:Hide" }
|
||||
TSM.tooltipOptions = { callback = "Options:LoadTooltipOptions" }
|
||||
TSM.moduleAPIs = {
|
||||
{ key = "runSearch", callback = "StartFilterSearch" },
|
||||
{ key = "runDestroySearch", callback = "StartDestroySearch" },
|
||||
{ key = "getSidebarPage", callback = "Sidebar:GetCurrentPage" },
|
||||
{ key = "getSearchMode", callback = "Search:GetCurrentSearchMode" },
|
||||
}
|
||||
|
||||
TSMAPI:NewModule(TSM)
|
||||
end
|
||||
|
||||
TSM.operationDefaults = {
|
||||
maxPrice = 1,
|
||||
evenStacks = nil,
|
||||
showAboveMaxPrice = nil,
|
||||
ignorePlayer = {},
|
||||
ignoreFactionrealm = {},
|
||||
relationships = {},
|
||||
}
|
||||
|
||||
function TSM:GetOperationInfo(operationName)
|
||||
TSMAPI:UpdateOperation("Shopping", operationName)
|
||||
local operation = TSM.operations[operationName]
|
||||
if not operation then return end
|
||||
|
||||
if operation.showAboveMaxPrice and operation.evenStacks then
|
||||
return format(L["Shopping for even stacks including those above the max price"])
|
||||
elseif operation.showAboveMaxPrice then
|
||||
return format(L["Shopping for auctions including those above the max price."])
|
||||
elseif operation.evenStacks then
|
||||
return format(L["Shopping for even stacks with a max price set."])
|
||||
else
|
||||
return format(L["Shopping for auctions with a max price set."])
|
||||
end
|
||||
end
|
||||
|
||||
function TSM:StartFilterSearch(searchQuery, callback)
|
||||
if not TSMAPI:AHTabIsVisible("Shopping") then return end
|
||||
TSM.Search:StartFilterSearch(searchQuery, nil, true)
|
||||
TSM.moduleAPICallback = callback
|
||||
end
|
||||
|
||||
function TSM:StartDestroySearch(searchQuery, callback)
|
||||
if not TSMAPI:AHTabIsVisible("Shopping") then return end
|
||||
local filters = TSM.Search:GetFilters(searchQuery)
|
||||
if filters and #filters == 1 then
|
||||
for itemString, name in pairs(TSM.db.global.destroyingTargetItems) do
|
||||
if strlower(name) == strlower(filters.currentFilter) then
|
||||
TSM.Destroying:StartDestroyingSearch(itemString, filters[1], true)
|
||||
TSM.Search:SetSearchText(searchQuery)
|
||||
TSM.moduleAPICallback = callback
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function TSM:GetMaxPrice(operationPrice, itemString)
|
||||
local price, err
|
||||
if type(operationPrice) == "number" then
|
||||
price = operationPrice
|
||||
elseif type(operationPrice) == "string" then
|
||||
local func, parseErr = TSMAPI:ParseCustomPrice(operationPrice)
|
||||
err = parseErr
|
||||
price = func and func(itemString)
|
||||
end
|
||||
return price ~= 0 and price or nil, err
|
||||
end
|
||||
|
||||
function TSM:AddSidebarFeature(...)
|
||||
TSM.modules.Sidebar:AddSidebarFeature(...)
|
||||
end
|
||||
|
||||
function TSM:GetTooltip(itemString)
|
||||
if not TSM.db.global.tooltip then return end
|
||||
local text = {}
|
||||
local moneyCoinsTooltip = TSMAPI:GetMoneyCoinsTooltip()
|
||||
itemString = TSMAPI:GetBaseItemString(itemString, true)
|
||||
local operations = TSMAPI:GetItemOperation(itemString, "Shopping")
|
||||
if not operations then return end
|
||||
local operationName = operations[1]
|
||||
TSMAPI:UpdateOperation("Shopping", operationName)
|
||||
local operation = TSM.operations[operationName]
|
||||
if operation then
|
||||
local maxPrice = TSM:GetMaxPrice(operation.maxPrice, itemString)
|
||||
if maxPrice then
|
||||
local priceText
|
||||
if moneyCoinsTooltip then
|
||||
priceText = (TSMAPI:FormatTextMoneyIcon(maxPrice, "|cffffffff", true) or "|cffffffff---|r")
|
||||
else
|
||||
priceText = (TSMAPI:FormatTextMoney(maxPrice, "|cffffffff", true) or "|cffffffff---|r")
|
||||
end
|
||||
tinsert(text, { left = " " .. L["Max Shopping Price:"], right = format("%s", priceText) })
|
||||
end
|
||||
end
|
||||
if #text > 0 then
|
||||
tinsert(text, 1, "|cffffff00" .. "TSM Shopping:")
|
||||
return text
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,38 @@
|
||||
## Interface: 30300
|
||||
## Title: |cff00ff00TradeSkillMaster_Shopping|r
|
||||
## Notes: Provides an interface for easily viewing, buying, and posting items.
|
||||
## Author: Sapu94, Bart39
|
||||
## Dependencies: TradeSkillMaster
|
||||
## Version: v2.3.6
|
||||
## SavedVariables: TradeSkillMaster_ShoppingDB
|
||||
## X-Curse-Packaged-Version: v2.3.6
|
||||
## X-Curse-Project-Name: TradeSkillMaster_Shopping
|
||||
## X-Curse-Project-ID: tradeskillmaster_shopping
|
||||
## X-Curse-Repository-ID: wow/tradeskillmaster_shopping/mainline
|
||||
|
||||
Locale\enUS.lua
|
||||
Locale\deDE.lua
|
||||
Locale\esES.lua
|
||||
Locale\esMX.lua
|
||||
Locale\frFR.lua
|
||||
Locale\koKR.lua
|
||||
Locale\ruRU.lua
|
||||
Locale\zhCN.lua
|
||||
Locale\zhTW.lua
|
||||
Locale\ptBR.lua
|
||||
|
||||
TradeSkillMaster_Shopping.lua
|
||||
modules\Util.lua
|
||||
modules\Search.lua
|
||||
modules\Destroying.lua
|
||||
modules\Options.lua
|
||||
|
||||
sidebar\Sidebar.lua
|
||||
sidebar\Saved.lua
|
||||
sidebar\Sniper.lua
|
||||
sidebar\Groups.lua
|
||||
sidebar\ShoppingLog.lua
|
||||
sidebar\QuickPosting.lua
|
||||
sidebar\CustomFilter.lua
|
||||
sidebar\Crafting.lua
|
||||
sidebar\Other.lua
|
||||
@@ -0,0 +1,274 @@
|
||||
local TSM = select(2, ...)
|
||||
local Destroying = TSM:NewModule("Destroying")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {sources={}}
|
||||
|
||||
|
||||
function Destroying:OnEnable()
|
||||
TSMAPI:CreateTimeDelay("shoppingDestroyingUpdateTargets", 0, private.UpdateTargetItems, 60) --1)
|
||||
TSM.db.global.destroyingTargetItems = TSM.db.global.destroyingTargetItems or {}
|
||||
end
|
||||
|
||||
function private:UpdateTargetItems()
|
||||
local update
|
||||
for itemString in pairs(TSMAPI.InkConversions) do
|
||||
private.sources[itemString] = "mill"
|
||||
if not TSM.db.global.destroyingTargetItems[itemString] then
|
||||
update = true
|
||||
local name = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name then
|
||||
TSM.db.global.destroyingTargetItems[itemString] = name
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, itemString in ipairs(TSMAPI:GetConversionTargetItems("mill")) do
|
||||
private.sources[itemString] = "mill"
|
||||
if not TSM.db.global.destroyingTargetItems[itemString] then
|
||||
update = true
|
||||
local name = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name then
|
||||
TSM.db.global.destroyingTargetItems[itemString] = name
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, itemString in ipairs(TSMAPI:GetConversionTargetItems("prospect")) do
|
||||
private.sources[itemString] = "prospect"
|
||||
if not TSM.db.global.destroyingTargetItems[itemString] then
|
||||
update = true
|
||||
local name = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name then
|
||||
TSM.db.global.destroyingTargetItems[itemString] = name
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, itemString in ipairs(TSMAPI:GetEnchantingTargetItems()) do
|
||||
private.sources[itemString] = "disenchant"
|
||||
if not TSM.db.global.destroyingTargetItems[itemString] then
|
||||
update = true
|
||||
local name = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name then
|
||||
TSM.db.global.destroyingTargetItems[itemString] = name
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not update then
|
||||
TSMAPI:CancelFrame("shoppingDestroyingUpdateTargets")
|
||||
end
|
||||
end
|
||||
|
||||
function Destroying:StartDestroyingSearch(target, filter, isCrafting)
|
||||
if not private.sources[target] then return TSM:Printf(L["Invalid destroy target: '%s'"], target) end
|
||||
|
||||
TSM.isCrafting = isCrafting
|
||||
Destroying.maxQuantity = filter.maxQuantity
|
||||
filter.maxPrice = nil
|
||||
if private.sources[target] == "mill" then
|
||||
private:TryStarting(private.StartMillingSearch, target, filter)
|
||||
elseif private.sources[target] == "prospect" then
|
||||
private:TryStarting(private.StartProspectingSearch, target, filter)
|
||||
elseif private.sources[target] == "disenchant" then
|
||||
private:TryStarting(private.StartDisenchantingSearch, target, filter)
|
||||
end
|
||||
TSMAPI:FireEvent("SHOPPING:SEARCH:STARTDESTROYSCAN", {target=target, filter=filter})
|
||||
end
|
||||
|
||||
function private:TryStarting(func, target, filter, attempt)
|
||||
attempt = attempt or 0
|
||||
if attempt <= 10 and not func(target, filter, attempt == 10) then
|
||||
TSMAPI:CreateTimeDelay("destroySearchTryStart", 0.1, function() private:TryStarting(func, target, filter, attempt+1) end)
|
||||
end
|
||||
end
|
||||
|
||||
function private:AddItemQuery(itemList, filter, itemString)
|
||||
local name = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name then
|
||||
local query = CopyTable(filter)
|
||||
query.name = name
|
||||
tinsert(itemList, query)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function private.StartMillingSearch(target, filter, lastAttempt)
|
||||
local matItemString = target
|
||||
local inkItemString, pigmentItemString
|
||||
if TSMAPI.InkConversions[target] then
|
||||
inkItemString = target
|
||||
pigmentItemString = TSMAPI.InkConversions[target].pigment
|
||||
else
|
||||
for itemString, data in pairs(TSMAPI.InkConversions) do
|
||||
if target == data.pigment then
|
||||
inkItemString = itemString
|
||||
pigmentItemString = target
|
||||
break
|
||||
end
|
||||
end
|
||||
if not inkItemString then return TSM:Printf(L["Unknown milling search target: '%s'"], target) end
|
||||
end
|
||||
|
||||
private.evenFilter = {}
|
||||
private.conversions = {}
|
||||
private.conversions[inkItemString] = 1
|
||||
private.conversions[pigmentItemString] = 1 / TSMAPI.InkConversions[inkItemString].pigmentPerInk
|
||||
local itemList = {}
|
||||
|
||||
-- add ink and pigment
|
||||
if not private:AddItemQuery(itemList, filter, inkItemString) and not lastAttempt then return end
|
||||
if not private:AddItemQuery(itemList, filter, pigmentItemString) and not lastAttempt then return end
|
||||
|
||||
-- add primary herbs
|
||||
for itemString, data in pairs(TSMAPI:GetItemConversions(pigmentItemString)) do
|
||||
if not private:AddItemQuery(itemList, filter, itemString) and not lastAttempt then return end
|
||||
private.evenFilter[itemString] = filter.evenOnly
|
||||
private.conversions[itemString] = data.rate / TSMAPI.InkConversions[inkItemString].pigmentPerInk
|
||||
end
|
||||
|
||||
-- deal with vendor trades
|
||||
local otherInks = TSMAPI.Conversions[inkItemString]
|
||||
for otherInk, otherInkData in pairs(otherInks or {}) do
|
||||
if not TSMAPI.Conversions[otherInk] and otherInkData.source == "vendortrade" and TSMAPI.InkConversions[otherInk] then
|
||||
local vendorTradeRate = otherInkData.rate
|
||||
for itemString, millData in pairs(TSMAPI:GetItemConversions(TSMAPI.InkConversions[otherInk].pigment)) do
|
||||
if not private:AddItemQuery(itemList, filter, itemString) and not lastAttempt then return end
|
||||
private.evenFilter[itemString] = filter.evenOnly
|
||||
private.conversions[itemString] = vendorTradeRate * millData.rate / TSMAPI.InkConversions[inkItemString].pigmentPerInk
|
||||
end
|
||||
if not private:AddItemQuery(itemList, filter, otherInk) and not lastAttempt then return end
|
||||
if not private:AddItemQuery(itemList, filter, TSMAPI.InkConversions[otherInk].pigment) and not lastAttempt then return end
|
||||
private.conversions[otherInk] = vendorTradeRate
|
||||
private.conversions[TSMAPI.InkConversions[otherInk].pigment] = vendorTradeRate / TSMAPI.InkConversions[otherInk].pigmentPerInk
|
||||
end
|
||||
end
|
||||
|
||||
private.mode = "mill"
|
||||
private.target = inkItemString
|
||||
if TSM.isCrafting then
|
||||
local func = TSMAPI:ParseCustomPrice("matprice")
|
||||
local price = func and func(matItemString) or nil
|
||||
private.targetMarketValue = price
|
||||
TSM.Util:ShowSearchFrame(true, L["% Mat Price"])
|
||||
else
|
||||
private.targetMarketValue = TSM:GetMaxPrice(TSM.db.global.marketValueSource, inkItemString)
|
||||
TSM.Util:ShowSearchFrame(true, L["% Target Value"])
|
||||
end
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:StartFilterScan(itemList, private.ScanCallback)
|
||||
return true
|
||||
end
|
||||
|
||||
function private.StartProspectingSearch(target, filter, lastAttempt)
|
||||
local itemList = {}
|
||||
private.evenFilter = {}
|
||||
if not private:AddItemQuery(itemList, filter, target) and not lastAttempt then return end
|
||||
for itemString in pairs(TSMAPI:GetItemConversions(target)) do
|
||||
if not private:AddItemQuery(itemList, filter, itemString) and not lastAttempt then return end
|
||||
private.evenFilter[itemString] = filter.evenOnly
|
||||
end
|
||||
|
||||
private.mode = "prospect"
|
||||
private.target = target
|
||||
if TSM.isCrafting then
|
||||
local func = TSMAPI:ParseCustomPrice("matprice")
|
||||
local price = func and func(target) or nil
|
||||
private.targetMarketValue = price
|
||||
TSM.Util:ShowSearchFrame(true, L["% Max Price"])
|
||||
else
|
||||
private.targetMarketValue = TSM:GetMaxPrice(TSM.db.global.marketValueSource, target)
|
||||
TSM.Util:ShowSearchFrame(true, L["% Target Value"])
|
||||
end
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:StartFilterScan(itemList, private.ScanCallback)
|
||||
return true
|
||||
end
|
||||
|
||||
function private.StartDisenchantingSearch(target, filter, lastAttempt)
|
||||
local disenchantData = TSMAPI:GetDisenchantData(target)
|
||||
if not disenchantData then return end
|
||||
|
||||
local queries = {}
|
||||
local query = TSMAPI:GetAuctionQueryInfo(target)
|
||||
if not query and not lastAttempt then return end
|
||||
if query then
|
||||
tinsert(queries, query)
|
||||
end
|
||||
for itemType, rarityData in pairs(disenchantData.itemTypes) do
|
||||
local class = 0
|
||||
if itemType == "Weapon" then
|
||||
class = 1
|
||||
elseif itemType == "Armor" then
|
||||
class = 2
|
||||
end
|
||||
for rarity, data in pairs(rarityData) do
|
||||
local minILevel = data[1].minItemLevel or 0
|
||||
local maxILevel = data[#data].maxItemLevel or 0
|
||||
local query = {name="", class=class, subClass=0, minLevel=disenchantData.minLevel, maxLevel=disenchantData.maxLevel, minILevel=minILevel, maxILevel=maxILevel, quality=rarity}
|
||||
tinsert(queries, query)
|
||||
end
|
||||
end
|
||||
|
||||
for itemString, data in pairs(TSMAPI.Conversions[target] or {}) do
|
||||
local query = TSMAPI:GetAuctionQueryInfo(itemString)
|
||||
if not query and not lastAttempt then return end
|
||||
if query then
|
||||
tinsert(queries, query)
|
||||
end
|
||||
end
|
||||
|
||||
private.mode = "disenchant"
|
||||
private.target = target
|
||||
if TSM.isCrafting then
|
||||
local func = TSMAPI:ParseCustomPrice("matprice")
|
||||
local price = func and func(target) or nil
|
||||
private.targetMarketValue = price
|
||||
TSM.Util:ShowSearchFrame(true, L["% Max Price"])
|
||||
else
|
||||
private.targetMarketValue = TSM:GetMaxPrice(TSM.db.global.marketValueSource, target)
|
||||
TSM.Util:ShowSearchFrame(true, L["% Target Value"])
|
||||
end
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:StartFilterScan(queries, private.ScanCallback)
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
function private.ScanCallback(event, ...)
|
||||
if event == "filter" then
|
||||
return
|
||||
elseif event == "process" then
|
||||
local itemString, auctionItem = ...
|
||||
local rate, shouldEvenFilter
|
||||
if private.mode == "mill" then
|
||||
rate = private.conversions[itemString]
|
||||
shouldEvenFilter = private.evenFilter[itemString]
|
||||
elseif private.mode == "disenchant" then
|
||||
if TSMAPI.Conversions[private.target] and TSMAPI.Conversions[private.target][itemString] then
|
||||
rate = TSMAPI.Conversions[private.target][itemString].rate
|
||||
else
|
||||
rate = TSMAPI:GetEnchantingConversionNum(private.target, itemString)
|
||||
end
|
||||
elseif private.mode == "prospect" then
|
||||
shouldEvenFilter = private.evenFilter[itemString]
|
||||
local conversions = TSMAPI:GetItemConversions(private.target)
|
||||
rate = conversions and conversions[itemString] and conversions[itemString].rate
|
||||
rate = rate and (rate / 5)
|
||||
end
|
||||
if itemString == private.target then
|
||||
auctionItem.destroyingNum = 1
|
||||
auctionItem:SetMarketValue(private.targetMarketValue)
|
||||
else
|
||||
if not rate then return end
|
||||
if shouldEvenFilter then
|
||||
auctionItem:FilterRecords(function(record) return record.count%5 ~= 0 end)
|
||||
end
|
||||
auctionItem.destroyingNum = 1/rate
|
||||
if private.targetMarketValue then
|
||||
auctionItem:SetMarketValue(private.targetMarketValue*rate)
|
||||
end
|
||||
end
|
||||
return auctionItem
|
||||
elseif event == "done" then
|
||||
TSM.Search:SetSearchBarDisabled(false)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,362 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
-- load the parent file (TSM) into a local variable and register this file as a module
|
||||
local TSM = select(2, ...)
|
||||
local Options = TSM:NewModule("Options", "AceEvent-3.0", "AceHook-3.0")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
local AceGUI = LibStub("AceGUI-3.0") -- load the AceGUI libraries
|
||||
|
||||
|
||||
function Options:Load(parent, operation, group)
|
||||
Options.treeGroup = AceGUI:Create("TSMTreeGroup")
|
||||
Options.treeGroup:SetLayout("Fill")
|
||||
Options.treeGroup:SetCallback("OnGroupSelected", function(...) Options:SelectTree(...) end)
|
||||
Options.treeGroup:SetStatusTable(TSM.db.global.optionsTreeStatus)
|
||||
parent:AddChild(Options.treeGroup)
|
||||
|
||||
Options:UpdateTree()
|
||||
if operation then
|
||||
if operation == "" then
|
||||
Options.currentGroup = group
|
||||
Options.treeGroup:SelectByPath(2)
|
||||
Options.currentGroup = nil
|
||||
else
|
||||
Options.treeGroup:SelectByPath(2, operation)
|
||||
end
|
||||
else
|
||||
Options.treeGroup:SelectByPath(1)
|
||||
end
|
||||
end
|
||||
|
||||
function Options:UpdateTree()
|
||||
local operationTreeChildren = {}
|
||||
|
||||
for name in pairs(TSM.operations) do
|
||||
tinsert(operationTreeChildren, { value = name, text = name })
|
||||
end
|
||||
|
||||
sort(operationTreeChildren, function(a, b) return a.value < b.value end)
|
||||
|
||||
Options.treeGroup:SetTree({ { value = 1, text = L["Options"] }, { value = 2, text = L["Operations"], children = operationTreeChildren } })
|
||||
end
|
||||
|
||||
function Options:SelectTree(treeGroup, _, selection)
|
||||
treeGroup:ReleaseChildren()
|
||||
|
||||
local major, minor = ("\001"):split(selection)
|
||||
major = tonumber(major)
|
||||
if major == 1 then
|
||||
Options:DrawGeneralSettings(treeGroup)
|
||||
elseif minor then
|
||||
Options:DrawOperationSettings(treeGroup, minor)
|
||||
else
|
||||
Options:DrawNewOperation(treeGroup)
|
||||
end
|
||||
end
|
||||
|
||||
function Options:DrawGeneralSettings(container)
|
||||
local page = {
|
||||
{
|
||||
type = "ScrollFrame",
|
||||
layout = "list",
|
||||
children = {
|
||||
{
|
||||
type = "InlineGroup",
|
||||
layout = "flow",
|
||||
title = L["General Options"],
|
||||
children = {
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Default Post Undercut Amount"],
|
||||
settingInfo = { TSM.db.global, "postUndercut" },
|
||||
relativeWidth = 0.5,
|
||||
acceptCustom = true,
|
||||
callback = function(_, _, value) TSMAPI.AuctionControl.undercut = value end,
|
||||
tooltip = L["What to set the default undercut to when posting items with Shopping."],
|
||||
},
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Market Value Price Source"],
|
||||
settingInfo = { TSM.db.global, "marketValueSource" },
|
||||
relativeWidth = 0.5,
|
||||
acceptCustom = true,
|
||||
tooltip = L["This is how Shopping calculates the '% Market Value' column in the search results."],
|
||||
},
|
||||
{
|
||||
type = "Slider",
|
||||
label = L["Max Disenchant Search Percent"],
|
||||
settingInfo = { TSM.db.global, "maxDeSearchPercent" },
|
||||
min = .1,
|
||||
max = 1,
|
||||
step = .01,
|
||||
isPercent = true,
|
||||
relativeWidth = 1,
|
||||
tooltip = L["This is the maximum percentage of disenchant value that the Other > Disenchant search will display results for."],
|
||||
},
|
||||
{
|
||||
type = "Slider",
|
||||
label = L["Min Disenchant Level"],
|
||||
settingInfo = { TSM.db.global, "minDeSearchLvl" },
|
||||
min = 1,
|
||||
max = 450,
|
||||
step = 1,
|
||||
isPercent = false,
|
||||
relativeWidth = 0.5,
|
||||
callback = function(self, _, value)
|
||||
if value > TSM.db.global.maxDeSearchLvl then
|
||||
TSM:Print(TSMAPI.Design:GetInlineColor("link2") .. L["Warning: The min disenchant level must be lower than the max disenchant level."] .. "|r")
|
||||
end
|
||||
TSM.db.global.minDeSearchLvl = min(value, TSM.db.global.maxDeSearchLvl)
|
||||
end,
|
||||
tooltip = L["This is the minimum item level that the Other > Disenchant search will display results for."],
|
||||
},
|
||||
{
|
||||
type = "Slider",
|
||||
label = L["Max Disenchant Level"],
|
||||
settingInfo = { TSM.db.global, "maxDeSearchLvl" },
|
||||
min = 1,
|
||||
max = 450,
|
||||
step = 1,
|
||||
isPercent = false,
|
||||
callback = function(self, _, value)
|
||||
if value < TSM.db.global.minDeSearchLvl then
|
||||
TSM:Print(TSMAPI.Design:GetInlineColor("link2") .. L["Warning: The max disenchant level must be higher than the min disenchant level."] .. "|r")
|
||||
end
|
||||
TSM.db.global.maxDeSearchLvl = max(value, TSM.db.global.minDeSearchLvl)
|
||||
end,
|
||||
relativeWidth = 0.5,
|
||||
tooltip = L["This is the maximum item level that the Other > Disenchant search will display results for."],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type = "Spacer",
|
||||
},
|
||||
{
|
||||
type = "InlineGroup",
|
||||
layout = "flow",
|
||||
title = "Posting Options",
|
||||
children = {
|
||||
{
|
||||
type = "Slider",
|
||||
label = L["Bid Percent"],
|
||||
settingInfo = { TSM.db.global, "postBidPercent" },
|
||||
min = .1,
|
||||
max = 1,
|
||||
step = .01,
|
||||
isPercent = true,
|
||||
relativeWidth = 0.5,
|
||||
tooltip = L["This is the percentage of your buyout price that your bid will be set to when posting auctions with Shopping."],
|
||||
},
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Normal Post Price"],
|
||||
settingInfo = { TSM.db.global, "normalPostPrice" },
|
||||
relativeWidth = 0.49,
|
||||
acceptCustom = true,
|
||||
tooltip = L["This is the default price Shopping will suggest to post items at when there's no others posted."],
|
||||
},
|
||||
{
|
||||
type = "HeadingLine"
|
||||
},
|
||||
{
|
||||
type = "Dropdown",
|
||||
label = L["Quick Posting Duration"],
|
||||
list = { AUCTION_DURATION_ONE, AUCTION_DURATION_TWO, AUCTION_DURATION_THREE },
|
||||
settingInfo = { TSM.db.global, "quickPostingDuration" },
|
||||
relativeWidth = 0.5,
|
||||
tooltip = L["The duration at which items will be posted via the 'Quick Posting' frame."],
|
||||
},
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Quick Posting Price"],
|
||||
settingInfo = { TSM.db.global, "quickPostingPrice" },
|
||||
relativeWidth = 0.49,
|
||||
acceptCustom = true,
|
||||
tooltip = L["This price is used to determine what items will be posted at through the 'Quick Posting' frame."],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
type = "InlineGroup",
|
||||
layout = "flow",
|
||||
title = L["Sniper Options"],
|
||||
children = {
|
||||
{
|
||||
type = "CheckBox",
|
||||
label = L["Below Vendor Sell Price"],
|
||||
settingInfo = { TSM.db.global, "sniperVendorPrice" },
|
||||
relativeWidth = 0.5,
|
||||
tooltip = L["Items which are below their vendor sell price will be displayed in Sniper searches."],
|
||||
},
|
||||
{
|
||||
type = "CheckBox",
|
||||
label = L["Below Max Price"],
|
||||
settingInfo = { TSM.db.global, "sniperMaxPrice" },
|
||||
relativeWidth = 0.49,
|
||||
tooltip = L["Items which are below their maximum price (per their group / Shopping operation) will be displayed in Sniper searches."],
|
||||
},
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Below Custom Price ('0c' to disable)"],
|
||||
settingInfo = { TSM.db.global, "sniperCustomPrice" },
|
||||
relativeWidth = 0.5,
|
||||
acceptCustom = true,
|
||||
tooltip = L["Items which are below this custom price will be displayed in Sniper searches."],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
TSMAPI:BuildPage(container, page)
|
||||
end
|
||||
|
||||
function Options:DrawNewOperation(container)
|
||||
local currentGroup = Options.currentGroup
|
||||
local page = {
|
||||
{
|
||||
-- scroll frame to contain everything
|
||||
type = "ScrollFrame",
|
||||
layout = "List",
|
||||
children = {
|
||||
{
|
||||
type = "InlineGroup",
|
||||
layout = "flow",
|
||||
title = L["New Operation"],
|
||||
children = {
|
||||
{
|
||||
type = "Label",
|
||||
text = L["Shopping operations contain settings items which you regularly buy from the auction house."],
|
||||
relativeWidth = 1,
|
||||
},
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Operation Name"],
|
||||
relativeWidth = 0.8,
|
||||
callback = function(self, _, name)
|
||||
name = (name or ""):trim()
|
||||
if name == "" then return end
|
||||
if TSM.operations[name] then
|
||||
self:SetText("")
|
||||
return TSM:Printf(L["Error creating operation. Operation with name '%s' already exists."], name)
|
||||
end
|
||||
TSM.operations[name] = CopyTable(TSM.operationDefaults)
|
||||
Options:UpdateTree()
|
||||
Options.treeGroup:SelectByPath(2, name)
|
||||
TSMAPI:NewOperationCallback("Shopping", currentGroup, name)
|
||||
end,
|
||||
tooltip = L["Give the new operation a name. A descriptive name will help you find this operation later."],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
TSMAPI:BuildPage(container, page)
|
||||
end
|
||||
|
||||
function Options:DrawOperationSettings(container, operationName)
|
||||
local tg = AceGUI:Create("TSMTabGroup")
|
||||
tg:SetLayout("Fill")
|
||||
tg:SetFullHeight(true)
|
||||
tg:SetFullWidth(true)
|
||||
tg:SetTabs({ { value = 1, text = L["General"] }, { value = 2, text = L["Relationships"] }, { value = 3, text = L["Management"] } })
|
||||
tg:SetCallback("OnGroupSelected", function(self, _, value)
|
||||
tg:ReleaseChildren()
|
||||
TSMAPI:UpdateOperation("Shopping", operationName)
|
||||
if value == 1 then
|
||||
Options:DrawOperationGeneral(self, operationName)
|
||||
elseif value == 2 then
|
||||
Options:DrawOperationRelationships(self, operationName)
|
||||
elseif value == 3 then
|
||||
TSMAPI:DrawOperationManagement(TSM, self, operationName)
|
||||
end
|
||||
end)
|
||||
container:AddChild(tg)
|
||||
tg:SelectTab(1)
|
||||
end
|
||||
|
||||
function Options:DrawOperationGeneral(container, operationName)
|
||||
local operation = TSM.operations[operationName]
|
||||
local page = {
|
||||
{
|
||||
type = "ScrollFrame",
|
||||
layout = "list",
|
||||
children = {
|
||||
{
|
||||
type = "InlineGroup",
|
||||
layout = "flow",
|
||||
title = L["General Operation Options"],
|
||||
children = {
|
||||
{
|
||||
type = "EditBox",
|
||||
label = L["Maximum Auction Price (per item)"],
|
||||
settingInfo = { operation, "maxPrice" },
|
||||
relativeWidth = 0.49,
|
||||
acceptCustom = true,
|
||||
disabled = operation.relationships.maxprice,
|
||||
tooltip = L["The highest price per item you will pay for items in affected by this operation."],
|
||||
},
|
||||
{
|
||||
type = "CheckBox",
|
||||
label = L["Show Auctions Above Max Price"],
|
||||
settingInfo = { operation, "showAboveMaxPrice" },
|
||||
disabled = operation.relationships.showAboveMaxPrice,
|
||||
tooltip = L["If checked, auctions above the max price will be shown."],
|
||||
},
|
||||
{
|
||||
type = "CheckBox",
|
||||
label = L["Even (5/10/15/20) Stacks Only"],
|
||||
settingInfo = { operation, "evenStacks" },
|
||||
disabled = operation.relationships.evenStacks,
|
||||
tooltip = L["If checked, only auctions posted in even quantities will be considered for purchasing."],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
TSMAPI:BuildPage(container, page)
|
||||
end
|
||||
|
||||
function Options:DrawOperationRelationships(container, operationName)
|
||||
local settingInfo = {
|
||||
{
|
||||
label = L["General Settings"],
|
||||
{ key = "maxPrice", label = L["Maximum Auction Price (per item)"] },
|
||||
{ key = "showAboveMaxPrice", label = L["Show Auctions Above Max Price"] },
|
||||
{ key = "evenStacks", label = L["Even (5/10/15/20) Stacks Only"] },
|
||||
},
|
||||
}
|
||||
TSMAPI:ShowOperationRelationshipTab(TSM, container, TSM.operations[operationName], settingInfo)
|
||||
end
|
||||
|
||||
function Options:LoadTooltipOptions(container)
|
||||
local page = {
|
||||
{
|
||||
type = "SimpleGroup",
|
||||
layout = "Flow",
|
||||
fullHeight = true,
|
||||
children = {
|
||||
{
|
||||
type = "CheckBox",
|
||||
label = L["Show Shopping Max Price in Tooltip"],
|
||||
settingInfo = { TSM.db.global, "tooltip" },
|
||||
callback = function(_, _, value) container:ReloadTab() end,
|
||||
tooltip = L["If checked, the maximum shopping price will be shown in the tooltip for the item."],
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
TSMAPI:BuildPage(container, page)
|
||||
end
|
||||
@@ -0,0 +1,589 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
local TSM = select(2, ...)
|
||||
local Search = TSM:NewModule("Search", "AceEvent-3.0", "AceHook-3.0")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
local private = {}
|
||||
|
||||
-- ------------------------------------------------ --
|
||||
-- GUI Creation functions --
|
||||
-- ------------------------------------------------ --
|
||||
|
||||
function Search:Show(frame)
|
||||
TSM.Util:SetParent(frame)
|
||||
private.searchBar = private.searchBar or private:CreateSearchBar(frame)
|
||||
private.searchBar:Show()
|
||||
private.searchBar.editBox:SetFocus()
|
||||
private.searchBar.editBox:SetText("")
|
||||
private.searchBar:Enable()
|
||||
private.searchBar.normal:Click()
|
||||
TSM.Sidebar:Show(frame)
|
||||
if TSM.db.global.sidebarBtn > #private.searchBar.buttons then
|
||||
TSM.db.global.sidebarBtn = 0
|
||||
end
|
||||
if TSM.db.global.sidebarBtn > 0 then
|
||||
if not private.searchBar.buttons[TSM.db.global.sidebarBtn].isSelected then
|
||||
private.searchBar.buttons[TSM.db.global.sidebarBtn]:Click()
|
||||
end
|
||||
else
|
||||
TSM.Sidebar:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
function Search:Hide()
|
||||
if not private.searchBar then return end
|
||||
private.searchBar:Hide()
|
||||
TSM.Util:HideSearchFrame()
|
||||
TSMAPI.AuctionControl:HideControlButtons()
|
||||
TSMAPI.AuctionScan:StopScan()
|
||||
TSM.Sidebar:Hide()
|
||||
end
|
||||
|
||||
function private:CreateSearchBar(parent)
|
||||
local function StartSearch(searchQuery)
|
||||
if private.mode == "normal" then
|
||||
Search:StartFilterSearch(searchQuery)
|
||||
elseif private.mode == "destroy" then
|
||||
private.searchBar.editBox:SetText(searchQuery)
|
||||
local filters = Search:GetFilters(searchQuery)
|
||||
if filters and #filters == 1 then
|
||||
for itemString, name in pairs(TSM.db.global.destroyingTargetItems) do
|
||||
if strlower(name) == strlower(filters.currentFilter) then
|
||||
return TSM.Destroying:StartDestroyingSearch(itemString, filters[1])
|
||||
end
|
||||
end
|
||||
TSM:Printf(L["Invalid target item for destroy search: '%s'"], filters.currentFilter)
|
||||
else
|
||||
TSM:Printf(L["Invalid destroy search: '%s'"], searchQuery)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function HandleModifiedItemClick(link)
|
||||
local putIntoChat = Search.hooks.HandleModifiedItemClick(link)
|
||||
if not putIntoChat and private.searchBar:IsVisible() and not private.searchBar.isDisabled and TSMAPI:AHTabIsVisible("Shopping") then
|
||||
local name = TSMAPI:GetSafeItemInfo(link)
|
||||
if name then
|
||||
StartSearch(name.."/exact")
|
||||
return true
|
||||
end
|
||||
end
|
||||
return putIntoChat
|
||||
end
|
||||
local function InsertLink(link)
|
||||
local putIntoChat = Search.hooks.ChatEdit_InsertLink(link)
|
||||
if not putIntoChat then
|
||||
if private.searchBar:IsVisible() and not private.searchBar.isDisabled and TSMAPI:AHTabIsVisible("Shopping") then
|
||||
local name = TSMAPI:GetSafeItemInfo(link)
|
||||
if name then
|
||||
StartSearch(name.."/exact")
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return putIntoChat
|
||||
end
|
||||
Search:RawHook("ChatEdit_InsertLink", InsertLink, true)
|
||||
Search:RawHook("HandleModifiedItemClick", HandleModifiedItemClick, true)
|
||||
|
||||
local function OnChar(self)
|
||||
local text = self:GetText()
|
||||
if private.mode == "normal" then
|
||||
for i=1, #TSM.db.global.previousSearches do
|
||||
local prevSearch = strlower(TSM.db.global.previousSearches[i])
|
||||
if strsub(prevSearch, 1, #text) == strlower(text) then
|
||||
self:SetText(prevSearch)
|
||||
self:HighlightText(#text, -1)
|
||||
break
|
||||
end
|
||||
end
|
||||
elseif private.mode == "destroy" then
|
||||
for _, name in pairs(TSM.db.global.destroyingTargetItems) do
|
||||
name = strlower(name)
|
||||
if strsub(name, 1, #text) == strlower(text) then
|
||||
self:SetText(name)
|
||||
self:HighlightText(#text, -1)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function OnEditFocusGained(self)
|
||||
self:HighlightText()
|
||||
end
|
||||
|
||||
local function OnEditFocusLost(self)
|
||||
self:HighlightText()
|
||||
end
|
||||
|
||||
local function OnUpdate(self)
|
||||
-- if self:IsEnabled() and not TSMAPI:AHTabIsVisible("Shopping") then
|
||||
if not TSMAPI:AHTabIsVisible("Shopping") then
|
||||
self:ClearFocus()
|
||||
end
|
||||
end
|
||||
|
||||
local function OnEnter(self)
|
||||
GameTooltip:SetOwner(self, "ANCHOR_BOTTOM")
|
||||
GameTooltip:SetMinimumWidth(400)
|
||||
GameTooltip:AddLine(L["Enter what you want to search for in this box. You can also use the following options for more complicated searches."].."\n", 1, 1, 1, 1)
|
||||
GameTooltip:AddLine(format("|cffffff00"..L["Multiple Search Terms:|r You can search for multiple things at once by simply separated them with a ';'. For example '%scopper ore; gold ore|r' will search for both copper and gold ore."].."\n", TSMAPI.Design:GetInlineColor("link2")), 1, 1, 1, 1)
|
||||
GameTooltip:AddLine(format("|cffffff00"..L["Inline Filters:|r You can easily add common search filters to your search such as rarity, level, and item type. For example '%sarmor/leather/epic/80/i200/i285|r' will search for all leather armor of epic quality that requires level 80 and has an ilvl between 200 and 285 inclusive. Also, '%sinferno ruby/exact|r' will display only raw inferno rubys (none of the cuts)."].."\n", TSMAPI.Design:GetInlineColor("link2"), TSMAPI.Design:GetInlineColor("link2")), 1, 1, 1, 1)
|
||||
GameTooltip:Show()
|
||||
end
|
||||
|
||||
|
||||
local searchBarFrame = CreateFrame("Frame", nil, parent)
|
||||
searchBarFrame:SetAllPoints()
|
||||
searchBarFrame:Hide()
|
||||
|
||||
local eb = TSMAPI.GUI:CreateInputBox(searchBarFrame)
|
||||
eb:SetPoint("TOPLEFT", 85, -5)
|
||||
eb:SetHeight(22)
|
||||
eb:SetWidth(600)
|
||||
eb:SetScript("OnShow", eb.SetFocus)
|
||||
eb:SetScript("OnEnterPressed", function() StartSearch(private.searchBar.editBox:GetText()) end)
|
||||
eb:SetScript("OnChar", OnChar)
|
||||
eb:SetScript("OnEditFocusGained", OnEditFocusGained)
|
||||
eb:SetScript("OnEditFocusLost", OnEditFocusLost)
|
||||
eb:SetScript("OnEnter", OnEnter)
|
||||
eb:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
||||
eb:SetScript("OnUpdate", OnUpdate)
|
||||
searchBarFrame.editBox = eb
|
||||
|
||||
local btn = TSMAPI.GUI:CreateButton(searchBarFrame, 20)
|
||||
btn:SetPoint("TOPLEFT", eb, "TOPRIGHT", 4, 0)
|
||||
btn:SetPoint("BOTTOMLEFT", eb, "BOTTOMRIGHT", 4, 0)
|
||||
btn:SetWidth(85)
|
||||
btn:SetText(SEARCH)
|
||||
btn:SetScript("OnClick", function() StartSearch(private.searchBar.editBox:GetText()) end)
|
||||
searchBarFrame.button = btn
|
||||
|
||||
local btn = TSMAPI.GUI:CreateButton(searchBarFrame, 16)
|
||||
btn:SetPoint("TOPLEFT", searchBarFrame.button, "TOPRIGHT", 4, 0)
|
||||
btn:SetPoint("BOTTOMLEFT", searchBarFrame.button, "BOTTOMRIGHT", 4, 0)
|
||||
btn:SetPoint("TOPRIGHT", -5, -5)
|
||||
btn:SetText(L["Stop"])
|
||||
btn:Disable()
|
||||
btn:SetScript("OnClick", function() TSM.Util:StopScan() searchBarFrame:Enable() end)
|
||||
searchBarFrame.stop = btn
|
||||
|
||||
local function OnModeChange(self)
|
||||
searchBarFrame.normal:UnlockHighlight()
|
||||
searchBarFrame.destroy:UnlockHighlight()
|
||||
self:LockHighlight()
|
||||
if self.mode ~= private.mode then
|
||||
private.mode = self.mode
|
||||
private:UpdateMode()
|
||||
end
|
||||
end
|
||||
|
||||
local btn = TSMAPI.GUI:CreateButton(searchBarFrame, 14)
|
||||
btn:SetPoint("TOPLEFT", eb, "BOTTOMLEFT", 0, -8)
|
||||
btn:SetHeight(16)
|
||||
btn:SetWidth(110)
|
||||
btn:SetText(L["Normal Mode"])
|
||||
btn:SetScript("OnClick", OnModeChange)
|
||||
btn.mode = "normal"
|
||||
btn.tooltip = L["When in normal mode, you may run simple and filtered searches of the auction house."]
|
||||
searchBarFrame.normal = btn
|
||||
|
||||
local btn = TSMAPI.GUI:CreateButton(searchBarFrame, 14)
|
||||
btn:SetPoint("TOPLEFT", searchBarFrame.normal, "BOTTOMLEFT", 0, -4)
|
||||
btn:SetPoint("TOPRIGHT", searchBarFrame.normal, "BOTTOMRIGHT", 0, -4)
|
||||
btn:SetHeight(16)
|
||||
btn:SetText(L["Destroy Mode"])
|
||||
btn:SetScript("OnClick", OnModeChange)
|
||||
btn.mode = "destroy"
|
||||
btn.tooltip = L["When in destroy mode, you simply enter a target item (ink/pigment, enchanting mat, gem, etc) into the search box to search for everything you can destroy to get that item."]
|
||||
searchBarFrame.destroy = btn
|
||||
|
||||
local line = TSMAPI.GUI:CreateHorizontalLine(searchBarFrame, 0)
|
||||
line:ClearAllPoints()
|
||||
line:SetHeight(4)
|
||||
line:SetPoint("TOPLEFT", eb, "BOTTOMLEFT", 120, -7)
|
||||
line:SetPoint("TOPRIGHT", 0, -34)
|
||||
|
||||
local pagesLabel = TSMAPI.GUI:CreateLabel(searchBarFrame)
|
||||
pagesLabel:SetPoint("TOPLEFT", eb, "BOTTOMLEFT", 125, -15)
|
||||
pagesLabel:SetHeight(20)
|
||||
pagesLabel:SetJustifyH("CENTER")
|
||||
pagesLabel:SetJustifyV("CENTER")
|
||||
pagesLabel:SetText(L["Sidebar Pages:"])
|
||||
pagesLabel:SetWidth(pagesLabel:GetWidth() + 5)
|
||||
|
||||
local buttons = {}
|
||||
local function OnClick(self)
|
||||
self.isSelected = not self.isSelected
|
||||
for _, btn in ipairs(buttons) do
|
||||
btn:UnlockHighlight()
|
||||
if btn ~= self then
|
||||
btn.isSelected = false
|
||||
end
|
||||
end
|
||||
if self.isSelected then
|
||||
TSM.db.global.sidebarBtn = self.index
|
||||
self:LockHighlight()
|
||||
TSM.Sidebar:Show()
|
||||
else
|
||||
TSM.db.global.sidebarBtn = 0
|
||||
self:UnlockHighlight()
|
||||
TSM.Sidebar:Hide()
|
||||
end
|
||||
TSM.Sidebar:ButtonClick(self.label)
|
||||
end
|
||||
local pages, callbacks = TSM.Sidebar:GetPages()
|
||||
for i, label in ipairs(pages) do
|
||||
local btn = TSMAPI.GUI:CreateButton(searchBarFrame, 16)
|
||||
btn:SetPoint("TOPLEFT", buttons[i-1] or pagesLabel, "TOPRIGHT", 5, 0)
|
||||
btn:SetHeight(20)
|
||||
btn:SetText(label)
|
||||
btn:SetWidth(ceil(btn:GetTextWidth()+10))
|
||||
btn:SetScript("OnClick", OnClick)
|
||||
btn.label = label
|
||||
btn.index = i
|
||||
buttons[i] = btn
|
||||
end
|
||||
searchBarFrame.buttons = buttons
|
||||
|
||||
local line = TSMAPI.GUI:CreateHorizontalLine(searchBarFrame, 0)
|
||||
line:ClearAllPoints()
|
||||
line:SetHeight(4)
|
||||
line:SetPoint("TOPLEFT", eb, "BOTTOMLEFT", 120, -40)
|
||||
line:SetPoint("TOPRIGHT", 0, -67)
|
||||
|
||||
local line = TSMAPI.GUI:CreateVerticalLine(searchBarFrame, 0)
|
||||
line:ClearAllPoints()
|
||||
line:SetPoint("TOPLEFT", eb, "BOTTOMLEFT", 120, -7)
|
||||
line:SetHeight(33)
|
||||
line:SetWidth(4)
|
||||
|
||||
searchBarFrame.Disable = function(self)
|
||||
self.isDisabled = true
|
||||
self.editBox:ClearFocus()
|
||||
self.editBox:HighlightText(0, 0)
|
||||
-- self.editBox:Disable()
|
||||
self.button:Disable()
|
||||
self.stop:Enable()
|
||||
end
|
||||
searchBarFrame.Enable = function(self)
|
||||
self.isDisabled = nil
|
||||
-- self.editBox:Enable()
|
||||
self.button:Enable()
|
||||
self.stop:Disable()
|
||||
end
|
||||
|
||||
return searchBarFrame
|
||||
end
|
||||
|
||||
function private:UpdateMode()
|
||||
private.searchBar.editBox:SetText("")
|
||||
if private.mode == "nomal" then
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Market Value"], true)
|
||||
elseif private.mode == "destroy" then
|
||||
TSM.Util:ShowSearchFrame(true, L["% Target Value"], true)
|
||||
end
|
||||
TSM.Util:StopScan()
|
||||
private.searchBar:Enable()
|
||||
end
|
||||
|
||||
local function ScanCallback(event, ...)
|
||||
if TSM.searchCallback then
|
||||
TSM.searchCallback(event)
|
||||
end
|
||||
if event == "filter" then
|
||||
local filter = ...
|
||||
return filter.maxPrice
|
||||
elseif event == "process" then
|
||||
local itemString, auctionItem = ...
|
||||
if auctionItem.query.maxPrice then
|
||||
auctionItem:FilterRecords(function(record)
|
||||
return (record:GetItemBuyout() or 0) > auctionItem.query.maxPrice
|
||||
end)
|
||||
end
|
||||
if TSM.isCrafting then
|
||||
local func = TSMAPI:ParseCustomPrice("matprice")
|
||||
local price = func and func(itemString) or nil
|
||||
auctionItem:SetMarketValue(price)
|
||||
else
|
||||
auctionItem:SetMarketValue(TSM:GetMaxPrice(TSM.db.global.marketValueSource, itemString))
|
||||
end
|
||||
return auctionItem
|
||||
elseif event == "done" then
|
||||
private.searchBar:Enable()
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
function Search:StartFilterSearch(filter, callback, isCrafting)
|
||||
TSM.isCrafting = isCrafting
|
||||
TSM.searchCallback = callback
|
||||
if strfind(filter, "item:([0-9]+):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?%-?([0-9]*)$") then --or strfind(filter, "battlepet:([0-9]+):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*)$") then
|
||||
filter = TSMAPI:GetSafeItemInfo(filter) or filter
|
||||
end
|
||||
if TSM.isCrafting then
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Mat Price"])
|
||||
else
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Market Value"])
|
||||
end
|
||||
private.searchBar.editBox:SetText(filter)
|
||||
private.searchBar:Disable()
|
||||
if filter ~= "" then
|
||||
for i=#TSM.db.global.previousSearches, 1, -1 do
|
||||
if strlower(TSM.db.global.previousSearches[i]) == strlower(filter) then
|
||||
tremove(TSM.db.global.previousSearches, i)
|
||||
end
|
||||
end
|
||||
tinsert(TSM.db.global.previousSearches, 1, filter)
|
||||
while #TSM.db.global.previousSearches > 100 do
|
||||
tremove(TSM.db.global.previousSearches)
|
||||
end
|
||||
TSM.Sidebar:UpdateCurrentFrame()
|
||||
end
|
||||
local isItemList, itemList = true, {}
|
||||
for _, searchTerm in ipairs({(";"):split(filter)}) do
|
||||
if tonumber(searchTerm) then
|
||||
tinsert(itemList, TSMAPI:GetItemString(searchTerm))
|
||||
else
|
||||
isItemList = nil
|
||||
end
|
||||
end
|
||||
TSMAPI:FireEvent("SHOPPING:SEARCH:STARTFILTERSCAN")
|
||||
|
||||
if isItemList then
|
||||
TSM.Util:StartItemScan(itemList, ScanCallback)
|
||||
else
|
||||
TSM.Util:StartFilterScan(Search:GetFilters(filter), ScanCallback)
|
||||
end
|
||||
end
|
||||
|
||||
function Search:SetSearchBarDisabled(disabled)
|
||||
if disabled then
|
||||
private.searchBar:Disable()
|
||||
else
|
||||
private.searchBar:Enable()
|
||||
end
|
||||
end
|
||||
|
||||
function Search:SetMode(mode)
|
||||
if mode == "normal" then
|
||||
private.searchBar.normal:Click()
|
||||
elseif mode == "destroy" then
|
||||
private.searchBar.destroy:Click()
|
||||
end
|
||||
end
|
||||
|
||||
function Search:SetSearchText(text)
|
||||
private.searchBar.editBox:SetText(text)
|
||||
end
|
||||
|
||||
|
||||
-- ------------------------------------------------ --
|
||||
-- Search Filter Util functions --
|
||||
-- ------------------------------------------------ --
|
||||
|
||||
local function GetMaxQuantity(str)
|
||||
if #str > 1 and strsub(str, 1, 1) == "x" then
|
||||
return tonumber(strsub(str, 2))
|
||||
end
|
||||
end
|
||||
|
||||
local function GetItemLevel(str)
|
||||
if #str > 1 and strsub(str, 1, 1) == "i" then
|
||||
return tonumber(strsub(str, 2))
|
||||
end
|
||||
end
|
||||
|
||||
local function GetItemClass(str)
|
||||
for i, class in ipairs({GetAuctionItemClasses()}) do
|
||||
if strlower(str) == strlower(class) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function GetItemSubClass(str, class)
|
||||
if not class then return end
|
||||
|
||||
for i, subClass in ipairs({GetAuctionItemSubClasses(class)}) do
|
||||
if strlower(str) == strlower(subClass) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function GetItemRarity(str)
|
||||
for i=0, 4 do
|
||||
local text = _G["ITEM_QUALITY"..i.."_DESC"]
|
||||
if strlower(str) == strlower(text) then
|
||||
return i
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function GetSearchFilterOptions(searchTerm)
|
||||
local parts = {("/"):split(searchTerm)}
|
||||
local queryString, class, subClass, minLevel, maxLevel, minILevel, maxILevel, rarity, usableOnly, exactOnly, evenOnly, maxQuantity, maxPrice
|
||||
|
||||
if #parts == 1 then
|
||||
return true, parts[1]
|
||||
elseif #parts == 0 then
|
||||
return false, L["Invalid Filter"]
|
||||
end
|
||||
|
||||
for i, str in ipairs(parts) do
|
||||
str = str:trim()
|
||||
|
||||
if tonumber(str) then
|
||||
if not minLevel then
|
||||
minLevel = tonumber(str)
|
||||
elseif not maxLevel then
|
||||
maxLevel = tonumber(str)
|
||||
else
|
||||
return false, L["Invalid Min Level"]
|
||||
end
|
||||
elseif GetMaxQuantity(str) then
|
||||
if not maxQuantity then
|
||||
maxQuantity = GetMaxQuantity(str)
|
||||
else
|
||||
return false, L["Invalid Max Quantity"]
|
||||
end
|
||||
elseif GetItemLevel(str) then
|
||||
if not minILevel then
|
||||
minILevel = GetItemLevel(str)
|
||||
elseif not maxILevel then
|
||||
maxILevel = GetItemLevel(str)
|
||||
else
|
||||
return false, L["Invalid Item Level"]
|
||||
end
|
||||
elseif not class and GetItemClass(str) then
|
||||
if not class then
|
||||
class = GetItemClass(str)
|
||||
else
|
||||
return false, L["Invalid Item Type"]
|
||||
end
|
||||
elseif GetItemSubClass(str, class) then
|
||||
if not subClass then
|
||||
subClass = GetItemSubClass(str, class)
|
||||
else
|
||||
return false, L["Invalid Item SubType"]
|
||||
end
|
||||
elseif GetItemRarity(str) then
|
||||
if not rarity then
|
||||
rarity = GetItemRarity(str)
|
||||
else
|
||||
return false, L["Invalid Item Rarity"]
|
||||
end
|
||||
elseif strlower(str) == "usable" then
|
||||
if not usableOnly then
|
||||
usableOnly = 1
|
||||
else
|
||||
return false, L["Invalid Usable Only Filter"]
|
||||
end
|
||||
elseif strlower(str) == "exact" then
|
||||
if not exactOnly then
|
||||
exactOnly = 1
|
||||
else
|
||||
return false, L["Invalid Exact Only Filter"]
|
||||
end
|
||||
elseif strlower(str) == "even" then
|
||||
if not evenOnly then
|
||||
evenOnly = 1
|
||||
else
|
||||
return false, L["Invalid Even Only Filter"]
|
||||
end
|
||||
elseif TSMAPI:UnformatTextMoney(str) then
|
||||
maxPrice = TSMAPI:UnformatTextMoney(str)
|
||||
elseif i == 1 then
|
||||
if strfind(str, "item:([0-9]+):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?%-?([0-9]*)$") then --or strfind(str, "battlepet:([0-9]+):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*):?([0-9]*)$") then
|
||||
queryString = TSMAPI:GetSafeItemInfo(str)
|
||||
else
|
||||
queryString = str
|
||||
end
|
||||
else
|
||||
return false, L["Unknown Filter"]
|
||||
end
|
||||
end
|
||||
|
||||
if maxLevel and minLevel and maxLevel < minLevel then
|
||||
local oldMaxLevel = maxLevel
|
||||
maxLevel = minLevel
|
||||
minLevel = oldMaxLevel
|
||||
end
|
||||
|
||||
if maxILevel and minILevel and maxILevel < minILevel then
|
||||
local oldMaxILevel = maxILevel
|
||||
maxILevel = minILevel
|
||||
minILevel = oldMaxILevel
|
||||
end
|
||||
|
||||
return true, queryString or "", class or 0, subClass or 0, minLevel or 0, maxLevel or 0, minILevel or 0, maxILevel or 0, rarity or -1, usableOnly or 0, exactOnly or nil, evenOnly or nil, maxQuantity or 0, maxPrice
|
||||
--return true, queryString or "", class or 0, subClass or 0, minLevel or 0, maxLevel or 0, minILevel or 0, maxILevel or 0, rarity or 0, usableOnly or 0, exactOnly or nil, evenOnly or nil, maxQuantity or 0, maxPrice
|
||||
end
|
||||
|
||||
-- gets all the filters for a given search term (possibly semicolon-deliminated list of search terms)
|
||||
function Search:GetFilters(searchQuery)
|
||||
local filters = {}
|
||||
local searchTerms = {(";"):split(searchQuery)}
|
||||
filters.num = 0
|
||||
|
||||
for i=1, #searchTerms do
|
||||
local searchTerm = searchTerms[i]:trim()
|
||||
if tonumber(searchTerm) then
|
||||
local filter = TSMAPI:GetAuctionQueryInfo(TSMAPI:GetItemString(searchTerm))
|
||||
if filter then
|
||||
tinsert(filters, filter)
|
||||
filters.num = filters.num + 1
|
||||
if filters.currentFilter then
|
||||
filters.currentFilter = filters.currentFilter.."; "..searchTerm
|
||||
else
|
||||
filters.currentFilter = searchTerm
|
||||
end
|
||||
if filters.currentSearchTerm then
|
||||
filters.currentSearchTerm = filters.currentSearchTerm .. "; "..searchTerm
|
||||
else
|
||||
filters.currentSearchTerm = searchTerm
|
||||
end
|
||||
end
|
||||
else
|
||||
local isValid, queryString, class, subClass, minLevel, maxLevel, minILevel, maxILevel, rarity, usableOnly, exactOnly, evenOnly, maxQuantity, maxPrice = GetSearchFilterOptions(searchTerm)
|
||||
|
||||
if not isValid then
|
||||
TSM:Print(L["Skipped the following search term because it's invalid."])
|
||||
TSM:Print("\""..searchTerm.."\": "..queryString)
|
||||
elseif strlenutf8(queryString) > 63 then
|
||||
TSM:Print(L["Skipped the following search term because it's too long. Blizzard does not allow search terms over 63 characters."])
|
||||
TSM:Print("\""..searchTerm.."\"")
|
||||
isValid = nil
|
||||
end
|
||||
|
||||
if isValid then
|
||||
filters.num = filters.num + 1
|
||||
if filters.currentFilter then
|
||||
filters.currentFilter = filters.currentFilter.."; "..queryString
|
||||
else
|
||||
filters.currentFilter = queryString
|
||||
end
|
||||
if filters.currentSearchTerm then
|
||||
filters.currentSearchTerm = filters.currentSearchTerm .. "; "..searchTerm
|
||||
else
|
||||
filters.currentSearchTerm = searchTerm
|
||||
end
|
||||
tinsert(filters, {name=queryString, usable=usableOnly, minLevel=minLevel, maxLevel=maxLevel, quality=rarity, class=class, subClass=subClass, minILevel=minILevel, maxILevel=maxILevel, exactOnly=exactOnly, evenOnly=evenOnly, maxQuantity=maxQuantity, maxPrice=maxPrice})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return filters
|
||||
end
|
||||
|
||||
function Search:GetCurrentSearchMode()
|
||||
return private.mode
|
||||
end
|
||||
@@ -0,0 +1,459 @@
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
-- TradeSkillMaster_Shopping --
|
||||
-- http://www.curse.com/addons/wow/tradeskillmaster_shopping --
|
||||
-- --
|
||||
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
|
||||
-- All Rights Reserved* - Detailed license information included with addon. --
|
||||
-- ------------------------------------------------------------------------------ --
|
||||
|
||||
local TSM = select(2, ...)
|
||||
local Util = TSM:NewModule("Util", "AceEvent-3.0", "AceHook-3.0")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
local private = {auctions={}}
|
||||
TSMAPI:RegisterForTracing(private, "TradeSkillMaster_Shopping_private")
|
||||
Util.shoppingLog = {}
|
||||
|
||||
|
||||
local function ControlCallback(event, ...)
|
||||
if event == "OnBuyout" then
|
||||
local auction = ...
|
||||
tinsert(Util.shoppingLog, {action="Buyout", link=auction.link, buyout=auction.buyout, count=auction.count})
|
||||
private:RemoveAuction(auction, event, TSMAPI:GetItemString(auction.link))
|
||||
elseif event == "OnCancel" then
|
||||
local auction = ...
|
||||
tinsert(Util.shoppingLog, {action="Cancel", link=auction.link, buyout=auction.buyout, count=auction.count})
|
||||
private:RemoveAuction(auction, event, TSMAPI:GetItemString(auction.link))
|
||||
elseif event == "OnPost" then
|
||||
local postInfo = ...
|
||||
local link = select(2, TSMAPI:GetSafeItemInfo(postInfo.itemString))
|
||||
for i=1, postInfo.numAuctions do
|
||||
tinsert(Util.shoppingLog, {auction="Post", link=link, buyout=postInfo.buyout, count=postInfo.stackSize})
|
||||
end
|
||||
private:AddPostedAuction(postInfo)
|
||||
end
|
||||
if TSM.searchCallback then
|
||||
TSM.searchCallback(event, ...)
|
||||
end
|
||||
end
|
||||
|
||||
function private:HasInBags(baseItemString)
|
||||
for _, _, itemString in TSMAPI:GetBagIterator() do
|
||||
if TSMAPI:GetBaseItemString(itemString) == baseItemString then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function private:CreateSearchFrame()
|
||||
local function OnShow(self)
|
||||
if not self.info then return end
|
||||
if self.info.isDestroying then
|
||||
self.rtNormal:Hide()
|
||||
self.rtDestroying:Show()
|
||||
self.rt = private.searchFrame.rtDestroying
|
||||
else
|
||||
self.rtNormal:Show()
|
||||
self.rtDestroying:Hide()
|
||||
self.rt = private.searchFrame.rtNormal
|
||||
end
|
||||
self.rt:SetColHeadText(#self.rt.headCols, self.info.pctColName)
|
||||
end
|
||||
|
||||
local frame = CreateFrame("Frame", nil, private.parent.content)
|
||||
frame:Hide()
|
||||
frame:SetAllPoints()
|
||||
frame:SetScript("OnShow", OnShow)
|
||||
|
||||
local statusBarFrame = CreateFrame("Frame", nil, frame)
|
||||
statusBarFrame:SetPoint("TOPLEFT", frame, "BOTTOMLEFT", 165, -2)
|
||||
statusBarFrame:SetWidth(250)
|
||||
statusBarFrame:SetHeight(30)
|
||||
frame.statusBar = TSMAPI.GUI:CreateStatusBar(statusBarFrame, "TSMShoppingStatusBar")
|
||||
|
||||
local handlers = {
|
||||
OnClick = function(_, data, self, button)
|
||||
-- they clicked on a data row
|
||||
if button == "LeftButton" then
|
||||
-- go to the page for this item
|
||||
local record = data.auctionRecord
|
||||
TSMAPI.AuctionScan:FindAuction(function() end, {itemString=data.itemString, buyout=record.buyout, count=record.count, seller=record.seller}, true)
|
||||
|
||||
if data.auctionRecord:IsPlayer() then
|
||||
private.controlButtons.cancel:Enable()
|
||||
private.controlButtons.buyout:Disable()
|
||||
private.controlButtons.post:Disable()
|
||||
elseif data.auctionRecord.buyout == 0 then
|
||||
private.controlButtons.buyout:Disable()
|
||||
private.controlButtons.cancel:Disable()
|
||||
private.controlButtons.post:Disable()
|
||||
else
|
||||
private.controlButtons.buyout:Enable()
|
||||
private.controlButtons.cancel:Disable()
|
||||
private.controlButtons.post:Disable()
|
||||
end
|
||||
if private:HasInBags(TSMAPI:GetBaseItemString(data.itemString)) then
|
||||
private.controlButtons.post:Enable()
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
local rt = TSMAPI:CreateAuctionResultsTable(frame, handlers, true)
|
||||
rt:SetData({})
|
||||
rt:SetSort(8, true)
|
||||
frame.rtNormal = rt
|
||||
|
||||
local rt2 = TSMAPI:CreateAuctionResultsTable(frame, handlers, true, true)
|
||||
rt2:SetData({})
|
||||
rt2:SetSort(5, true)
|
||||
frame.rtDestroying = rt2
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function Util:SetParent(parent)
|
||||
private.parent = parent
|
||||
end
|
||||
|
||||
function Util:ShowSearchFrame(isDestroying, pctColName, clearRT)
|
||||
if private.searchFrame and private.searchFrame:IsVisible() then
|
||||
Util:HideSearchFrame()
|
||||
end
|
||||
private.searchFrame = private.searchFrame or private:CreateSearchFrame()
|
||||
private.searchFrame.info = {isDestroying=isDestroying, pctColName=pctColName}
|
||||
private.searchFrame:Show()
|
||||
if clearRT then
|
||||
private.searchFrame.rtNormal:SetData({})
|
||||
private.searchFrame.rtDestroying:SetData({})
|
||||
end
|
||||
private.controlButtons = TSMAPI.AuctionControl:ShowControlButtons(private.parent, private.searchFrame.rt, ControlCallback, "Shopping", TSM.db.global.postBidPercent, TSM.db.global.postUndercut)
|
||||
private.controlButtons.buyout:Disable()
|
||||
private.controlButtons.cancel:Disable()
|
||||
private.controlButtons.post:Disable()
|
||||
TSMAPI.AuctionScan:StopScan()
|
||||
TSMAPI.AuctionScan:ClearCache()
|
||||
private.searchFrame.statusBar:SetStatusText("")
|
||||
private.searchFrame.statusBar:UpdateStatus(0, 0)
|
||||
private.mode = isDestroying and "destroy" or "normal"
|
||||
TSM.Search:SetMode(private.mode)
|
||||
end
|
||||
|
||||
function Util:HideSearchFrame()
|
||||
private.searchFrame:Hide()
|
||||
TSMAPI.AuctionControl:HideControlButtons()
|
||||
TSMAPI.AuctionScan:StopScan()
|
||||
TSMAPI.AuctionScan:ClearCache()
|
||||
end
|
||||
|
||||
|
||||
function Util:StartItemScan(itemList, callback)
|
||||
if type(itemList) ~= "table" then return end
|
||||
private:PrepareForScan(callback)
|
||||
if #itemList == 1 then private.searchItem = itemList[1] end
|
||||
TSMAPI:GenerateQueries(itemList, private.ScanCallback)
|
||||
end
|
||||
|
||||
function Util:StartFilterScan(filters, callback)
|
||||
if type(filters) ~= "table" then return end
|
||||
|
||||
private:PrepareForScan(callback)
|
||||
if #filters == 1 then
|
||||
for _, _, itemString in TSMAPI:GetBagIterator() do
|
||||
local name = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name and filters[1].name and strlower(name) == strlower(filters[1].name) then
|
||||
private.searchItem = itemString
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
private.filterList = filters
|
||||
private.numFilters = #private.filterList
|
||||
private:ScanNextFilter()
|
||||
end
|
||||
|
||||
function Util:StartLastPageScan(callback)
|
||||
private:PrepareForScan(callback, true)
|
||||
TSMAPI.AuctionScan:ScanLastPage(private.ScanCallback)
|
||||
end
|
||||
|
||||
function Util:StopScan()
|
||||
TSMAPI:CancelFrame("shoppingRestartSniper")
|
||||
TSMAPI.AuctionScan:StopScan()
|
||||
private:ScanComplete()
|
||||
end
|
||||
|
||||
|
||||
|
||||
function private:PrepareForScan(callback, isLastPageScan)
|
||||
TSMAPI:CancelFrame("shoppingRestartSniper")
|
||||
TSMAPI.AuctionScan:StopScan()
|
||||
private.searchItem = nil
|
||||
private.isLastPageScan = isLastPageScan
|
||||
private.callback = callback
|
||||
wipe(private.auctions)
|
||||
if private.isLastPageScan then
|
||||
private.searchFrame.statusBar:SetStatusText("Scanning last page...")
|
||||
else
|
||||
private.searchFrame.statusBar:SetStatusText(L["Preparing filters..."])
|
||||
end
|
||||
private.searchFrame.rt:SetData({})
|
||||
private.searchFrame.rt:SetDisabled(true)
|
||||
private.searchFrame.statusBar:UpdateStatus(0, 0)
|
||||
TSM.moduleAPICallback = nil
|
||||
end
|
||||
|
||||
local scanStatus, pageStatus
|
||||
function private.ScanCallback(event, ...)
|
||||
if event == "QUERY_COMPLETE" then
|
||||
private.filterList = ...
|
||||
private.numFilters = #private.filterList
|
||||
private:ScanNextFilter()
|
||||
elseif event == "QUERY_UPDATE" then
|
||||
local arg1, arg2 = ...
|
||||
private:UpdateStatus("query", arg1, arg2)
|
||||
elseif event == "SCAN_PAGE_UPDATE" then
|
||||
private:UpdateStatus("page", ...)
|
||||
elseif event == "SCAN_TIMEOUT" then
|
||||
tremove(private.filterList, 1)
|
||||
private:ScanNextFilter()
|
||||
elseif event == "SCAN_COMPLETE" then
|
||||
if not private.filterList or not private.filterList[1] then return end -- protect against sniper scan starts causing issues
|
||||
local data = ...
|
||||
if private.filterList[1].items then
|
||||
for _, itemString in ipairs(private.filterList[1].items) do
|
||||
if data[itemString] then
|
||||
if data[itemString].isBaseItem then
|
||||
for iString, auctionitem in pairs(data) do
|
||||
if iString ~= itemString and TSMAPI:GetBaseItemString(iString) == itemString then
|
||||
auctionitem.query = private.filterList[1]
|
||||
private:ProcessItem(iString, auctionitem)
|
||||
end
|
||||
end
|
||||
else
|
||||
data[itemString].query = private.filterList[1]
|
||||
private:ProcessItem(itemString, data[itemString])
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
for itemString, auctionData in pairs(data) do
|
||||
if not auctionData.isBaseItem then
|
||||
auctionData.query = private.filterList[1]
|
||||
private:ProcessItem(itemString, auctionData)
|
||||
end
|
||||
end
|
||||
end
|
||||
private:UpdateRT()
|
||||
private.searchFrame.rt:ClearSelection()
|
||||
tremove(private.filterList, 1)
|
||||
private:ScanNextFilter()
|
||||
elseif event == "SCAN_LAST_PAGE_COMPLETE" then
|
||||
local data = ...
|
||||
for itemString, auctionData in pairs(data) do
|
||||
if not auctionData.isBaseItem then
|
||||
if auctionData and #auctionData.records > 0 then
|
||||
if private.auctions[itemString] then
|
||||
private.auctions[itemString].shouldCompact = true
|
||||
private.auctions[itemString]:PopulateCompactRecords()
|
||||
local existingRecords = {}
|
||||
for _, record in ipairs(private.auctions[itemString].compactRecords) do
|
||||
local key = strjoin("~", record.uniqueID, record.count, record.buyout, record.minBid, record.timeLeft)
|
||||
existingRecords[key] = true
|
||||
end
|
||||
for _, record in ipairs(auctionData.records) do
|
||||
local key = strjoin("~", record.uniqueID, record.count, record.buyout, record.minBid, record.timeLeft)
|
||||
if not existingRecords[key] then
|
||||
private.auctions[itemString]:AddRecord(record)
|
||||
else
|
||||
for _, record2 in ipairs(private.auctions[itemString].records) do
|
||||
local key2 = strjoin("~", record.uniqueID, record.count, record.buyout, record.minBid, record.timeLeft)
|
||||
if key2 == key and record2.seller ~= "?" then
|
||||
record2.seller = record.seller
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
private.auctions[itemString] = auctionData
|
||||
end
|
||||
private.auctions[itemString] = private.callback("process", itemString, private.auctions[itemString])
|
||||
end
|
||||
end
|
||||
end
|
||||
private:UpdateRT()
|
||||
private.searchFrame.rt:ClearSelection()
|
||||
TSMAPI:CreateTimeDelay("shoppingRestartSniper", 0, function() TSMAPI.AuctionScan:ScanLastPage(private.ScanCallback) end)
|
||||
end
|
||||
end
|
||||
|
||||
function private:ScanNextFilter()
|
||||
if #private.filterList == 0 then
|
||||
return private:ScanComplete()
|
||||
end
|
||||
pageStatus = {0, 1}
|
||||
private:UpdateStatus("scan", private.numFilters-#private.filterList+1, private.numFilters)
|
||||
TSMAPI.AuctionScan:RunQuery(private.filterList[1], private.ScanCallback, true, private.callback("filter", private.filterList[1]), true)
|
||||
end
|
||||
|
||||
function private:UpdateStatus(statusType, ...)
|
||||
if statusType == "query" then
|
||||
private.searchFrame.statusBar:SetStatusText(format(L["Preparing Filter %d / %d"], ...))
|
||||
private.searchFrame.statusBar:UpdateStatus(0, 0)
|
||||
else
|
||||
if statusType == "scan" then
|
||||
scanStatus = {...}
|
||||
elseif statusType == "page" then
|
||||
pageStatus = {...}
|
||||
end
|
||||
private.searchFrame.statusBar:SetStatusText(format(L["Scanning %d / %d (Page %d / %d)"], scanStatus[1], scanStatus[2], pageStatus[1]+1, pageStatus[2]))
|
||||
private.searchFrame.statusBar:UpdateStatus(100*(scanStatus[1]-1)/scanStatus[2], 100*pageStatus[1]/pageStatus[2])
|
||||
end
|
||||
end
|
||||
|
||||
function private:ScanComplete()
|
||||
if not private.callback then return end
|
||||
private.searchFrame.statusBar:SetStatusText(L["Done Scanning"])
|
||||
private.searchFrame.statusBar:UpdateStatus(100, 100)
|
||||
private.searchFrame.rt:SetDisabled(false)
|
||||
if #private.searchFrame.rt.auctionData == 1 then
|
||||
private.searchFrame.rt:SetExpanded(private.searchFrame.rt.auctionData[1]:GetItemString(), true)
|
||||
private.searchFrame.rt.rows[1].cols[1]:Click()
|
||||
elseif #private.searchFrame.rt.auctionData == 0 and private.searchItem and private:HasInBags(TSMAPI:GetBaseItemString(private.searchItem)) then
|
||||
private.controlButtons.post:Enable()
|
||||
local postPrice = TSM:GetMaxPrice(TSM.db.global.normalPostPrice, private.searchItem) or 0
|
||||
TSMAPI.AuctionControl:SetNoResultItem(private.searchItem, postPrice)
|
||||
end
|
||||
|
||||
if #private.searchFrame.rt.auctionData == 0 and TSM.moduleAPICallback then
|
||||
TSM.moduleAPICallback()
|
||||
end
|
||||
private.callback("done", private.auctions)
|
||||
TSMAPI:FireEvent("SHOPPING:SEARCH:SCANDONE", #private.searchFrame.rt.auctionData)
|
||||
end
|
||||
|
||||
-- processes scan data for a specific item
|
||||
function private:ProcessItem(itemString, auctionItem)
|
||||
-- make sure we haven't already scanned this item (possible with common search terms)
|
||||
if private.auctions[itemString] then return end
|
||||
if not itemString or not auctionItem then return end
|
||||
local query = auctionItem.query
|
||||
query.minILevel = query.minILevel or 0
|
||||
query.maxILevel = query.maxILevel or 0
|
||||
query.minLevel = query.minLevel or 0
|
||||
query.maxLevel = query.maxLevel or 0
|
||||
local name, _, _, ilvl, lvl = TSMAPI:GetSafeItemInfo(itemString)
|
||||
|
||||
-- check if this item is outside our level or ilvl filters
|
||||
if query.minILevel > 0 and (ilvl < query.minILevel or (query.maxILevel > 0 and ilvl > query.maxILevel)) then
|
||||
private.auctions[itemString] = nil
|
||||
return
|
||||
end
|
||||
if query.minLevel > 0 and (lvl < query.minLevel or (query.maxLevel > 0 and lvl > query.maxLevel)) then
|
||||
private.auctions[itemString] = nil
|
||||
return
|
||||
end
|
||||
|
||||
-- check for /exact filter
|
||||
if query.exactOnly and strlower(name) ~= strlower(query.name) then
|
||||
private.auctions[itemString] = nil
|
||||
return
|
||||
end
|
||||
|
||||
-- remove any records that don't have buyouts
|
||||
for i=#auctionItem.records, 1, -1 do
|
||||
local record = auctionItem.records[i]
|
||||
if not record.buyout or record.buyout == 0 then
|
||||
auctionItem:RemoveRecord(i)
|
||||
end
|
||||
end
|
||||
|
||||
-- check if this auctionItem has records left
|
||||
if #auctionItem.records == 0 then return end
|
||||
|
||||
auctionItem = private.callback("process", itemString, auctionItem)
|
||||
if not auctionItem or #auctionItem.records == 0 then return end
|
||||
|
||||
-- store auctionItem
|
||||
auctionItem:PopulateCompactRecords()
|
||||
private.auctions[itemString] = auctionItem
|
||||
end
|
||||
|
||||
function private:UpdateRT()
|
||||
local rtData = {}
|
||||
for _, obj in pairs(private.auctions) do
|
||||
tinsert(rtData, obj)
|
||||
end
|
||||
private.searchFrame.rt:SetData(rtData)
|
||||
end
|
||||
|
||||
function private:RemoveAuction(auction, event, itemString)
|
||||
if private.auctions[itemString] then
|
||||
-- remove this record from the auctionItem
|
||||
for i, record in ipairs(private.auctions[itemString].records) do
|
||||
if record.parent.itemLink == auction.link and record.buyout == auction.buyout and record.count == auction.count and record.seller == auction.seller then
|
||||
private.auctions[itemString]:RemoveRecord(i)
|
||||
if #private.auctions[itemString].records == 0 then
|
||||
private.auctions[itemString] = nil
|
||||
else
|
||||
-- handle max quantities on queries
|
||||
local query = private.auctions[itemString].query
|
||||
if event == "OnBuyout" and query then
|
||||
if private.mode == "normal" and (query.maxQuantity or 0) > 0 then
|
||||
query.maxQuantity = query.maxQuantity - auction.count
|
||||
if TSM.moduleAPICallback then TSM.moduleAPICallback(max(query.maxQuantity, 0), itemString, auction.count) end
|
||||
for item, auctionItem in pairs(private.auctions) do
|
||||
if auctionItem.query and auctionItem.query.maxQuantity and auctionItem.query.maxQuantity <= 0 then
|
||||
private.auctions[item] = nil
|
||||
end
|
||||
end
|
||||
if not private.auctions[itemString] then
|
||||
private.controlButtons.buyout:Disable()
|
||||
TSMAPI.AuctionControl:HideConfirmation()
|
||||
TSM:Printf(L["Maximum quantity purchased for %s."], auction.link)
|
||||
end
|
||||
elseif private.mode == "destroy" and (TSM.Destroying.maxQuantity or 0) > 0 then
|
||||
TSM.Destroying.maxQuantity = TSM.Destroying.maxQuantity - auction.count / auction.destroyingNum
|
||||
if TSM.moduleAPICallback then TSM.moduleAPICallback(max(TSM.Destroying.maxQuantity, 0), itemString, auction.count) end
|
||||
if TSM.Destroying.maxQuantity <= 0 then
|
||||
private.controlButtons.buyout:Disable()
|
||||
TSMAPI.AuctionControl:HideConfirmation()
|
||||
TSM:Printf(L["Maximum quantity purchased for destroy search."])
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local baseItemString = TSMAPI:GetBaseItemString(itemString)
|
||||
if baseItemString ~= itemString then
|
||||
return private:RemoveAuction(auction, event, baseItemString)
|
||||
end
|
||||
|
||||
private:UpdateRT()
|
||||
local selected = private.searchFrame.rt:GetSelectedAuction()
|
||||
if not TSMAPI.AuctionControl:IsConfirmationVisible() then
|
||||
-- select the auction that was previously selected
|
||||
if not private.searchFrame.rt:GetSelectedAuction() and selected then
|
||||
-- we bought all of this auction, so select the new first occurace of this item
|
||||
private.searchFrame.rt:SetSelectedAuction(selected.parent:GetItemString())
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function private:AddPostedAuction(postInfo)
|
||||
local link = select(2, TSMAPI:GetSafeItemInfo(postInfo.itemString))
|
||||
local texture = select(10, TSMAPI:GetSafeItemInfo(postInfo.itemString))
|
||||
if not private.auctions[postInfo.itemString] then
|
||||
private.auctions[postInfo.itemString] = TSMAPI.AuctionScan:NewAuctionItem()
|
||||
private.auctions[postInfo.itemString]:SetItemLink(link)
|
||||
private.auctions[postInfo.itemString]:SetTexture(texture)
|
||||
end
|
||||
private.auctions[postInfo.itemString]:AddAuctionRecord(postInfo.stackSize, postInfo.bid, 0, postInfo.buyout, 0, nil, UnitName("player"), postInfo.duration)
|
||||
private.auctions[postInfo.itemString]:PopulateCompactRecords()
|
||||
private:UpdateRT()
|
||||
private.searchFrame.rt:SetSelectedAuction()
|
||||
end
|
||||
@@ -0,0 +1,239 @@
|
||||
local TSM = select(2, ...)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {}
|
||||
|
||||
function private.Create(parent)
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:Hide()
|
||||
frame:SetAllPoints()
|
||||
|
||||
-- row 1 - filter
|
||||
local y = 5
|
||||
local filterText = TSMAPI.GUI:CreateLabel(frame)
|
||||
filterText:SetPoint("TOPLEFT", 5, -y)
|
||||
filterText:SetHeight(20)
|
||||
filterText:SetText(L["Search Filter:"])
|
||||
|
||||
local filterInputBox = TSMAPI.GUI:CreateInputBox(frame)
|
||||
filterInputBox:SetPoint("TOPLEFT", filterText, "TOPRIGHT", 5, 0)
|
||||
filterInputBox:SetPoint("TOPRIGHT", -5, -y)
|
||||
filterInputBox:SetHeight(20)
|
||||
filterInputBox:SetScript("OnShow", filterInputBox.SetFocus)
|
||||
frame.filterInputBox = filterInputBox
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(y+27))
|
||||
|
||||
-- row 2 - required level range
|
||||
y = y + 35
|
||||
local levelText = TSMAPI.GUI:CreateLabel(frame)
|
||||
levelText:SetPoint("TOPLEFT", 5, -y)
|
||||
levelText:SetHeight(20)
|
||||
levelText:SetText(L["Required Level Range:"])
|
||||
|
||||
local levelMinBox = TSMAPI.GUI:CreateInputBox(frame)
|
||||
levelMinBox:SetPoint("TOPLEFT", levelText, "TOPRIGHT", 5, 0)
|
||||
levelMinBox:SetHeight(20)
|
||||
levelMinBox:SetWidth(60)
|
||||
levelMinBox:SetNumeric(true)
|
||||
frame.levelMinBox = levelMinBox
|
||||
|
||||
local label = TSMAPI.GUI:CreateLabel(frame)
|
||||
label:SetPoint("TOPLEFT", levelMinBox, "TOPRIGHT", 5, 0)
|
||||
label:SetHeight(20)
|
||||
label:SetText("-")
|
||||
|
||||
local levelMaxBox = TSMAPI.GUI:CreateInputBox(frame)
|
||||
levelMaxBox:SetPoint("TOPLEFT", label, "TOPRIGHT", 5, 0)
|
||||
levelMaxBox:SetPoint("TOPRIGHT", -5, -y)
|
||||
levelMaxBox:SetHeight(20)
|
||||
levelMaxBox:SetNumeric(true)
|
||||
frame.levelMaxBox = levelMaxBox
|
||||
|
||||
-- row 3 - item level range
|
||||
y = y + 30
|
||||
local levelText = TSMAPI.GUI:CreateLabel(frame)
|
||||
levelText:SetPoint("TOPLEFT", 5, -y)
|
||||
levelText:SetHeight(20)
|
||||
levelText:SetText(L["Item Level Range:"])
|
||||
|
||||
local itemLevelMinBox = TSMAPI.GUI:CreateInputBox(frame)
|
||||
itemLevelMinBox:SetPoint("TOPLEFT", levelText, "TOPRIGHT", 5, 0)
|
||||
itemLevelMinBox:SetHeight(20)
|
||||
itemLevelMinBox:SetWidth(70)
|
||||
itemLevelMinBox:SetNumeric(true)
|
||||
frame.itemLevelMinBox = itemLevelMinBox
|
||||
|
||||
local label = TSMAPI.GUI:CreateLabel(frame)
|
||||
label:SetPoint("TOPLEFT", itemLevelMinBox, "TOPRIGHT", 5, 0)
|
||||
label:SetHeight(20)
|
||||
label:SetText("-")
|
||||
|
||||
local itemLevelMaxBox = TSMAPI.GUI:CreateInputBox(frame)
|
||||
itemLevelMaxBox:SetPoint("TOPLEFT", label, "TOPRIGHT", 5, 0)
|
||||
itemLevelMaxBox:SetPoint("TOPRIGHT", -5, -y)
|
||||
itemLevelMaxBox:SetHeight(20)
|
||||
itemLevelMaxBox:SetNumeric(true)
|
||||
frame.itemLevelMaxBox = itemLevelMaxBox
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(y+25))
|
||||
|
||||
-- row 4 - class
|
||||
y = y + 30
|
||||
local list = {GetAuctionItemClasses()}
|
||||
local classDropdown = TSMAPI.GUI:CreateDropdown(frame, list, "")
|
||||
classDropdown:SetLabel(L["Item Class"])
|
||||
classDropdown:SetPoint("TOPLEFT", 5, -y)
|
||||
classDropdown:SetPoint("TOPRIGHT", 0, -y)
|
||||
classDropdown:SetCallback("OnValueChanged", function(_,_,value)
|
||||
frame.subClassDropdown:SetValue()
|
||||
frame.subClassDropdown:SetList({GetAuctionItemSubClasses(value)})
|
||||
frame.subClassDropdown:SetDisabled(false)
|
||||
end)
|
||||
frame.classDropdown = classDropdown
|
||||
|
||||
-- row 5 - subclass
|
||||
y = y + 50
|
||||
local subClassDropdown = TSMAPI.GUI:CreateDropdown(frame, {}, "")
|
||||
subClassDropdown:SetLabel(L["Item SubClass"])
|
||||
subClassDropdown:SetPoint("TOPLEFT", 5, -y)
|
||||
subClassDropdown:SetPoint("TOPRIGHT", 0, -y)
|
||||
subClassDropdown:SetDisabled(true)
|
||||
frame.subClassDropdown = subClassDropdown
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(y+55))
|
||||
|
||||
-- row 6 - rarity
|
||||
y = y + 60
|
||||
local rarityList = {}
|
||||
for i = 1, 4 do tinsert(rarityList, _G["ITEM_QUALITY"..i.."_DESC"]) end
|
||||
local rarityDropdown = TSMAPI.GUI:CreateDropdown(frame, rarityList, "")
|
||||
rarityDropdown:SetLabel(L["Minimum Rarity"])
|
||||
rarityDropdown:SetPoint("TOPLEFT", 5, -y)
|
||||
rarityDropdown:SetPoint("TOPRIGHT", 0, -y)
|
||||
frame.rarityDropdown = rarityDropdown
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(y+55))
|
||||
|
||||
-- row 7 - usable / exact
|
||||
y = y + 60
|
||||
local usableCheckBox = TSMAPI.GUI:CreateCheckBox(frame, L["If set, only items which are usable by your character will be included in the results."])
|
||||
usableCheckBox:SetLabel("Usable")
|
||||
usableCheckBox:SetPoint("TOPLEFT", 5, -y)
|
||||
usableCheckBox:SetWidth((frame:GetWidth()/2)-5)
|
||||
frame.usableCheckBox = usableCheckBox
|
||||
|
||||
local exactCheckBox = TSMAPI.GUI:CreateCheckBox(frame, L["If set, only items which exactly match the search filter you have set will be included in the results."])
|
||||
exactCheckBox:SetLabel("Exact")
|
||||
exactCheckBox:SetPoint("TOPRIGHT", 5, -y)
|
||||
exactCheckBox:SetWidth((frame:GetWidth()/2)-5)
|
||||
frame.exactCheckBox = exactCheckBox
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(y+30))
|
||||
|
||||
-- row 8 - maximum quantity
|
||||
y = y + 35
|
||||
local maxQtyText = TSMAPI.GUI:CreateLabel(frame)
|
||||
maxQtyText:SetPoint("TOPLEFT", 5, -y)
|
||||
maxQtyText:SetHeight(20)
|
||||
maxQtyText:SetText(L["Maximum Quantity to Buy:"])
|
||||
|
||||
local maxQtyBox = TSMAPI.GUI:CreateInputBox(frame)
|
||||
maxQtyBox:SetPoint("TOPLEFT", maxQtyText, "TOPRIGHT", 5, 0)
|
||||
maxQtyBox:SetPoint("TOPRIGHT", -5, -y)
|
||||
maxQtyBox:SetHeight(20)
|
||||
maxQtyBox:SetNumeric(true)
|
||||
frame.maxQtyBox = maxQtyBox
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(y+35))
|
||||
|
||||
-- row 9 - clear / search buttons
|
||||
local clearBtn = TSMAPI.GUI:CreateButton(frame, 20)
|
||||
clearBtn:SetPoint("BOTTOMLEFT", 5, 5)
|
||||
clearBtn:SetWidth((frame:GetWidth()/2)-7.5)
|
||||
clearBtn:SetHeight(25)
|
||||
clearBtn:SetText(L["Reset Filters"])
|
||||
clearBtn:SetScript("OnClick", function() private:ResetFilters(frame) end)
|
||||
frame.clearBtn = clearBtn
|
||||
|
||||
local startBtn = TSMAPI.GUI:CreateButton(frame, 20)
|
||||
startBtn:SetPoint("TOPLEFT", clearBtn, "TOPRIGHT", 5, 0)
|
||||
startBtn:SetPoint("BOTTOMRIGHT", -5, 5)
|
||||
startBtn:SetHeight(25)
|
||||
startBtn:SetText(L["Start Search"])
|
||||
startBtn:SetScript("OnClick", function() private:StartSearch(frame) end)
|
||||
frame.startBtn = startBtn
|
||||
|
||||
private:ResetFilters(frame)
|
||||
return frame
|
||||
end
|
||||
|
||||
function private:ResetFilters(frame)
|
||||
frame.filterInputBox:SetText("")
|
||||
frame.levelMinBox:SetText("")
|
||||
frame.levelMaxBox:SetText("")
|
||||
frame.itemLevelMinBox:SetText("")
|
||||
frame.itemLevelMaxBox:SetText("")
|
||||
frame.classDropdown:SetValue()
|
||||
frame.subClassDropdown:SetValue()
|
||||
frame.subClassDropdown:SetDisabled(true)
|
||||
frame.rarityDropdown:SetValue()
|
||||
frame.usableCheckBox:SetValue(false)
|
||||
frame.exactCheckBox:SetValue(false)
|
||||
frame.maxQtyBox:SetText("")
|
||||
end
|
||||
|
||||
function private:StartSearch(frame)
|
||||
local filter = frame.filterInputBox:GetText()
|
||||
|
||||
local minLevel = frame.levelMinBox:GetNumber()
|
||||
local maxLevel = frame.levelMaxBox:GetNumber()
|
||||
if maxLevel > 0 then
|
||||
filter = format("%s/%d/%d", filter, minLevel, maxLevel)
|
||||
elseif minLevel > 0 then
|
||||
filter = format("%s/%d", filter, minLevel)
|
||||
end
|
||||
|
||||
local minItemLevel = frame.itemLevelMinBox:GetNumber()
|
||||
local maxItemLevel = frame.itemLevelMaxBox:GetNumber()
|
||||
if maxItemLevel > 0 then
|
||||
filter = format("%s/i%d/i%d", filter, minItemLevel, maxItemLevel)
|
||||
elseif minItemLevel > 0 then
|
||||
filter = format("%s/i%d", filter, minItemLevel)
|
||||
end
|
||||
|
||||
local class = frame.classDropdown:GetValue()
|
||||
if class then
|
||||
local classes = {GetAuctionItemClasses()}
|
||||
filter = format("%s/%s", filter, classes[class])
|
||||
local subClass = frame.subClassDropdown:GetValue()
|
||||
if subClass then
|
||||
local subClasses = {GetAuctionItemSubClasses(class)}
|
||||
filter = format("%s/%s", filter, subClasses[subClass])
|
||||
end
|
||||
end
|
||||
|
||||
local rarity = frame.rarityDropdown:GetValue()
|
||||
if rarity then
|
||||
filter = format("%s/%s", filter, _G["ITEM_QUALITY"..rarity.."_DESC"])
|
||||
end
|
||||
|
||||
if frame.usableCheckBox:GetValue() then
|
||||
filter = format("%s/usable", filter)
|
||||
end
|
||||
|
||||
if frame.exactCheckBox:GetValue() then
|
||||
filter = format("%s/exact", filter)
|
||||
end
|
||||
|
||||
local maxQty = frame.maxQtyBox:GetNumber()
|
||||
if maxQty > 0 then
|
||||
filter = format("%s/x%d", filter, maxQty)
|
||||
end
|
||||
|
||||
TSM.Search:StartFilterSearch(filter)
|
||||
end
|
||||
|
||||
do
|
||||
TSM:AddSidebarFeature(L["Custom Filter"], private.Create)
|
||||
end
|
||||
@@ -0,0 +1,113 @@
|
||||
local TSM = select(2, ...)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {itemOperations={}}
|
||||
|
||||
function private.Create(parent)
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:SetAllPoints()
|
||||
|
||||
local stContainer = CreateFrame("Frame", nil, frame)
|
||||
stContainer:SetPoint("TOPLEFT", 0, -35)
|
||||
stContainer:SetPoint("BOTTOMRIGHT", 0, 30)
|
||||
TSMAPI.Design:SetFrameColor(stContainer)
|
||||
frame.groupTree = TSMAPI:CreateGroupTree(stContainer, "Shopping", "Shopping_AH")
|
||||
private.groupTree = frame.groupTree
|
||||
|
||||
local helpText = TSMAPI.GUI:CreateLabel(frame)
|
||||
helpText:SetPoint("TOPLEFT")
|
||||
helpText:SetPoint("TOPRIGHT")
|
||||
helpText:SetHeight(35)
|
||||
helpText:SetJustifyH("CENTER")
|
||||
helpText:SetJustifyV("CENTER")
|
||||
helpText:SetText(L["Select the groups which you would like to include in the search."])
|
||||
frame.helpText = helpText
|
||||
|
||||
local startBtn = TSMAPI.GUI:CreateButton(frame, 16)
|
||||
startBtn:SetPoint("BOTTOMLEFT", 3, 3)
|
||||
startBtn:SetPoint("BOTTOMRIGHT", -3, 3)
|
||||
startBtn:SetHeight(20)
|
||||
startBtn:SetText(L["Start Search"])
|
||||
startBtn:SetScript("OnClick", private.StartScan)
|
||||
frame.startBtn = startBtn
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function private.ScanCallback(event, ...)
|
||||
if event == "filter" then
|
||||
local filter = ...
|
||||
local maxPrice
|
||||
for _, itemString in ipairs(filter.items) do
|
||||
local operation = private.itemOperations[itemString]
|
||||
local operationPrice = TSM:GetMaxPrice(operation.maxPrice, itemString)
|
||||
if not operationPrice then return end
|
||||
if operation.showAboveMaxPrice then
|
||||
maxPrice = nil
|
||||
break
|
||||
end
|
||||
maxPrice = maxPrice and max(maxPrice, operationPrice) or operationPrice
|
||||
end
|
||||
return maxPrice
|
||||
elseif event == "process" then
|
||||
local itemString, auctionItem = ...
|
||||
-- filter out auctions according to operation settings
|
||||
itemString = TSMAPI:GetBaseItemString(itemString, true)
|
||||
local operation = private.itemOperations[itemString]
|
||||
if not operation then return end
|
||||
local operationPrice = TSM:GetMaxPrice(operation.maxPrice, itemString)
|
||||
if not operationPrice then return end
|
||||
auctionItem:FilterRecords(function(record)
|
||||
if operation.evenStacks and record.count % 5 ~= 0 then
|
||||
return true
|
||||
end
|
||||
if not operation.showAboveMaxPrice then
|
||||
return (record:GetItemBuyout() or 0) > operationPrice
|
||||
end
|
||||
end)
|
||||
auctionItem:SetMarketValue(operationPrice)
|
||||
return auctionItem
|
||||
elseif event == "done" then
|
||||
TSM.Search:SetSearchBarDisabled(false)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
function private.StartScan()
|
||||
TSMAPI:FireEvent("SHOPPING:GROUPS:STARTSCAN")
|
||||
wipe(private.itemOperations)
|
||||
for groupName, data in pairs(private.groupTree:GetSelectedGroupInfo()) do
|
||||
groupName = TSMAPI:FormatGroupPath(groupName, true)
|
||||
for _, opName in ipairs(data.operations) do
|
||||
TSMAPI:UpdateOperation("Shopping", opName)
|
||||
local opSettings = TSM.operations[opName]
|
||||
if not opSettings then
|
||||
-- operation doesn't exist anymore in Auctioning
|
||||
TSM:Printf(L["'%s' has a Shopping operation of '%s' which no longer exists. Shopping will ignore this group until this is fixed."], groupName, opName)
|
||||
else
|
||||
-- it's a valid operation
|
||||
for itemString in pairs(data.items) do
|
||||
local _, err = TSM:GetMaxPrice(opSettings.maxPrice, itemString)
|
||||
if err then
|
||||
TSM:Printf(L["Invalid custom price source for %s. %s"], TSMAPI:GetSafeItemInfo(itemString) or itemString, err)
|
||||
else
|
||||
private.itemOperations[itemString] = opSettings
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local itemList = {}
|
||||
for itemString in pairs(private.itemOperations) do
|
||||
tinsert(itemList, itemString)
|
||||
end
|
||||
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Max Price"])
|
||||
TSM.Util:StartItemScan(itemList, private.ScanCallback)
|
||||
end
|
||||
|
||||
do
|
||||
TSM:AddSidebarFeature(L["TSM Groups"], private.Create)
|
||||
end
|
||||
@@ -0,0 +1,259 @@
|
||||
local TSM = select(2, ...)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {}
|
||||
|
||||
function private.Create(parent)
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:SetAllPoints()
|
||||
private.frame = frame
|
||||
|
||||
frame:SetScript("OnShow", function()
|
||||
local lastScan = TSMAPI:ModuleAPI("AuctionDB", "lastCompleteScan")
|
||||
for itemID, data in pairs(lastScan or {}) do
|
||||
TSMAPI:GetSafeItemInfo(itemID) -- request item info from the server ahead of time
|
||||
end
|
||||
end)
|
||||
|
||||
local helpText = TSMAPI.GUI:CreateLabel(frame)
|
||||
helpText:SetPoint("TOPLEFT")
|
||||
helpText:SetPoint("TOPRIGHT")
|
||||
helpText:SetHeight(35)
|
||||
helpText:SetJustifyH("CENTER")
|
||||
helpText:SetJustifyV("CENTER")
|
||||
helpText:SetText(L["The vendor search looks for items on the AH below their vendor sell price."])
|
||||
|
||||
local startBtn = TSMAPI.GUI:CreateButton(frame, 16)
|
||||
startBtn:SetPoint("TOPLEFT", helpText, "BOTTOMLEFT", 3, -3)
|
||||
startBtn:SetPoint("TOPRIGHT", helpText, "BOTTOMRIGHT", -3, -3)
|
||||
startBtn:SetHeight(20)
|
||||
startBtn:SetText(L["Start Vendor Search"])
|
||||
startBtn:SetScript("OnClick", private.StartVendorSearch)
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -75)
|
||||
|
||||
|
||||
local helpText2 = TSMAPI.GUI:CreateLabel(frame)
|
||||
helpText2:SetPoint("TOPLEFT", 0, -80)
|
||||
helpText2:SetPoint("TOPRIGHT", 0, -80)
|
||||
helpText2:SetHeight(75)
|
||||
helpText2:SetJustifyH("CENTER")
|
||||
helpText2:SetJustifyV("CENTER")
|
||||
helpText2:SetText(L["The disenchant search looks for items on the AH below their disenchant value. You can set the maximum percentage of disenchant value to search for in the Shopping General options"])
|
||||
|
||||
local startBtn2 = TSMAPI.GUI:CreateButton(frame, 16)
|
||||
startBtn2:SetPoint("TOPLEFT", helpText2, "BOTTOMLEFT", 0, -3)
|
||||
startBtn2:SetPoint("TOPRIGHT", helpText2, "BOTTOMRIGHT", 0, -3)
|
||||
startBtn2:SetHeight(20)
|
||||
startBtn2:SetText(L["Start Disenchant Search"])
|
||||
startBtn2:SetScript("OnClick", private.StartDisenchantSearch)
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -200)
|
||||
|
||||
|
||||
local helpText3 = TSMAPI.GUI:CreateLabel(frame)
|
||||
helpText3:SetPoint("TOPLEFT", 0, -225)
|
||||
helpText3:SetPoint("TOPRIGHT", 0, -225)
|
||||
helpText3:SetHeight(80)
|
||||
helpText3:SetJustifyH("CENTER")
|
||||
helpText3:SetJustifyV("CENTER")
|
||||
helpText3:SetText(L["The Sniper feature will look in real-time for items that have recently been posted to the AH which are worth snatching! You can configure the parameters of Sniper in the Shopping options."])
|
||||
|
||||
local helpText4 = TSMAPI.GUI:CreateLabel(frame)
|
||||
helpText4:SetPoint("TOPLEFT", helpText3, "BOTTOMLEFT", 0, -5)
|
||||
helpText4:SetPoint("TOPRIGHT", helpText3, "BOTTOMRIGHT", 0, -5)
|
||||
helpText4:SetHeight(35)
|
||||
helpText4:SetJustifyH("CENTER")
|
||||
helpText4:SetJustifyV("CENTER")
|
||||
helpText4:SetText(L["NOTE: The scan must be stopped before you can buy anything."])
|
||||
|
||||
local startBtn = TSMAPI.GUI:CreateButton(frame, 16)
|
||||
startBtn:SetPoint("TOPLEFT", helpText4, "BOTTOMLEFT", 0, -5)
|
||||
startBtn:SetWidth((frame:GetWidth() / 2) - 2.5)
|
||||
startBtn:SetHeight(20)
|
||||
startBtn:SetText(L["Start Sniper"])
|
||||
startBtn:SetScript("OnClick", private.StartSniperSearch)
|
||||
|
||||
local stopBtn = TSMAPI.GUI:CreateButton(frame, 16)
|
||||
stopBtn:SetPoint("TOPRIGHT", helpText4, "BOTTOMRIGHT", 0, -5)
|
||||
stopBtn:SetWidth((frame:GetWidth() / 2) - 2.5)
|
||||
stopBtn:SetHeight(20)
|
||||
stopBtn:SetText(L["Stop Sniper"])
|
||||
stopBtn:SetScript("OnClick", private.StopSniperSearch)
|
||||
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function private.VendorSearchCallback(event, ...)
|
||||
if event == "filter" then
|
||||
local filter = ...
|
||||
local maxPrice
|
||||
for _, itemString in ipairs(filter.items) do
|
||||
local vendor = select(11, TSMAPI:GetSafeItemInfo(itemString))
|
||||
maxPrice = maxPrice and max(maxPrice, vendor) or vendor
|
||||
end
|
||||
return maxPrice
|
||||
elseif event == "process" then
|
||||
local itemString, auctionItem = ...
|
||||
local vendor = select(11, TSMAPI:GetSafeItemInfo(itemString))
|
||||
if not vendor then return end
|
||||
auctionItem:FilterRecords(function(record)
|
||||
return (record:GetItemBuyout() or 0) >= vendor
|
||||
end)
|
||||
auctionItem:SetMarketValue(vendor)
|
||||
return auctionItem
|
||||
elseif event == "done" then
|
||||
local auctions = ...
|
||||
local profit = 0
|
||||
for itemString, data in pairs(auctions) do
|
||||
local link = select(2, TSMAPI:GetSafeItemInfo(itemString))
|
||||
local vendor = select(11, TSMAPI:GetSafeItemInfo(itemString))
|
||||
for _, record in ipairs(data.records) do
|
||||
profit = profit + vendor * record.count - record.buyout
|
||||
end
|
||||
end
|
||||
TSM:Printf(L["Vendor Search Profit: %s"], TSMAPI:FormatTextMoney(profit))
|
||||
TSM.Search:SetSearchBarDisabled(false)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
function private:StartVendorSearch()
|
||||
local itemList = {}
|
||||
local lastScan = TSMAPI:ModuleAPI("AuctionDB", "lastCompleteScan")
|
||||
if not lastScan then
|
||||
TSM:Print(L["No recent AuctionDB scan data found."])
|
||||
return
|
||||
end
|
||||
|
||||
local count = 0
|
||||
for itemID, data in pairs(lastScan) do
|
||||
-- this must be GetItemInfo since these are itemIDs
|
||||
local link = select(2, GetItemInfo(itemID))
|
||||
local vendor = select(11, GetItemInfo(itemID))
|
||||
if link and data.minBuyout and data.minBuyout < vendor then
|
||||
tinsert(itemList, TSMAPI:GetItemString(link))
|
||||
end
|
||||
end
|
||||
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Vendor Price"])
|
||||
TSM.Util:StartItemScan(itemList, private.VendorSearchCallback)
|
||||
TSMAPI:FireEvent("SHOPPING:SEARCH:STARTVENDORSCAN", {num=#itemList})
|
||||
end
|
||||
|
||||
do
|
||||
TSM:AddSidebarFeature(OTHER, private.Create)
|
||||
end
|
||||
|
||||
function private:StartDisenchantSearch()
|
||||
local itemList = {}
|
||||
local lastScan = TSMAPI:ModuleAPI("AuctionDB", "lastCompleteScan")
|
||||
if not lastScan then
|
||||
TSM:Print(L["No recent AuctionDB scan data found."])
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
for itemID, data in pairs(lastScan) do
|
||||
-- this must be GetItemInfo since these are itemIDs
|
||||
local _, link, _, iLvl = GetItemInfo(itemID)
|
||||
if iLvl and iLvl >= TSM.db.global.minDeSearchLvl and iLvl <= TSM.db.global.maxDeSearchLvl then
|
||||
local deValue = TSMAPI:ModuleAPI("TradeSkillMaster", "deValue", link)
|
||||
-- if link and data.minBuyout and deValue * (TSM.db.global.maxDeSearchPercent or 1) > data.minBuyout then
|
||||
if link and data.minBuyout and (data.minBuyout / deValue) < (TSM.db.global.maxDeSearchPercent or 1) then
|
||||
tinsert(itemList, TSMAPI:GetItemString(link))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:ShowSearchFrame(nil, L["% DE Value"])
|
||||
TSM.Util:StartItemScan(itemList, private.DisenchantSearchCallback)
|
||||
end
|
||||
|
||||
function private.DisenchantSearchCallback(event, ...)
|
||||
if event == "filter" then
|
||||
local filter = ...
|
||||
local maxPrice
|
||||
for _, itemString in ipairs(filter.items) do
|
||||
local deValue = TSMAPI:ModuleAPI("TradeSkillMaster", "deValue", itemString)
|
||||
maxPrice = maxPrice and max(maxPrice, deValue) or deValue
|
||||
end
|
||||
return maxPrice
|
||||
elseif event == "process" then
|
||||
local itemString, auctionItem = ...
|
||||
local deValue = TSMAPI:ModuleAPI("TradeSkillMaster", "deValue", itemString)
|
||||
if not deValue then return end
|
||||
auctionItem:FilterRecords(function(record)
|
||||
return (record:GetItemBuyout() or 0) >= deValue
|
||||
end)
|
||||
auctionItem:SetMarketValue(deValue)
|
||||
return auctionItem
|
||||
elseif event == "done" then
|
||||
local auctions = ...
|
||||
local profit = 0
|
||||
for itemString, data in pairs(auctions) do
|
||||
local link = select(2, TSMAPI:GetSafeItemInfo(itemString))
|
||||
local deValue = TSMAPI:ModuleAPI("TradeSkillMaster", "deValue", itemString)
|
||||
for _, record in ipairs(data.records) do
|
||||
profit = profit + deValue * record.count - record.buyout
|
||||
end
|
||||
end
|
||||
TSM:Printf(L["Disenchant Search Profit: %s"], TSMAPI:FormatTextMoney(profit))
|
||||
TSM.Search:SetSearchBarDisabled(false)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
function private:StartSniperSearch()
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Market Value"])
|
||||
TSM.Search:SetSearchBarDisabled(true)
|
||||
TSM.Util:StartLastPageScan(private.SniperScanCallback)
|
||||
TSMAPI:FireEvent("SHOPPING:SEARCH:STARTSNIPER")
|
||||
end
|
||||
|
||||
function private:StopSniperSearch()
|
||||
TSM.Search:SetSearchBarDisabled(false)
|
||||
TSM.Util:StopScan()
|
||||
end
|
||||
|
||||
function private.SniperScanCallback(event, itemString, auctionItem)
|
||||
if event == "process" then
|
||||
local vendorPrice, maxPrice, customPrice
|
||||
do
|
||||
local vendor = select(11, TSMAPI:GetSafeItemInfo(itemString))
|
||||
if vendor then
|
||||
vendorPrice = vendor
|
||||
end
|
||||
local operations = TSMAPI:GetItemOperation(itemString, "Shopping")
|
||||
local opSettings = operations and operations[1] and TSM.operations[operations[1]]
|
||||
if opSettings and opSettings.maxPrice then
|
||||
maxPrice = TSM:GetMaxPrice(opSettings.maxPrice, itemString)
|
||||
end
|
||||
customPrice = TSM:GetMaxPrice(TSM.db.global.sniperCustomPrice, itemString)
|
||||
end
|
||||
auctionItem:FilterRecords(function(record)
|
||||
local itemBuyout = record:GetItemBuyout()
|
||||
if not itemBuyout or itemBuyout == 0 then return true end
|
||||
if TSM.db.global.sniperVendorPrice and vendorPrice and itemBuyout <= vendorPrice then
|
||||
return false
|
||||
end
|
||||
if TSM.db.global.sniperMaxPrice and maxPrice and itemBuyout <= maxPrice then
|
||||
return false
|
||||
end
|
||||
if customPrice and itemBuyout <= customPrice then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end)
|
||||
auctionItem:SetMarketValue(TSM:GetMaxPrice(TSM.db.global.marketValueSource, itemString))
|
||||
if #auctionItem.records == 0 then return end
|
||||
auctionItem.shouldCompact = true
|
||||
auctionItem:PopulateCompactRecords()
|
||||
return auctionItem
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,123 @@
|
||||
local TSM = select(2, ...)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {}
|
||||
|
||||
function private.Create(parent)
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:Hide()
|
||||
frame:SetAllPoints()
|
||||
frame:SetScript("OnShow", private.UpdateSTData)
|
||||
frame:RegisterEvent("BAG_UPDATE")
|
||||
frame:SetScript("OnEvent", function() TSMAPI:CreateTimeDelay("quickPostingBagUpdate", 0.1, function() private.UpdateSTData(frame) end) end)
|
||||
|
||||
local label = TSMAPI.GUI:CreateLabel(frame, "small")
|
||||
label:SetPoint("TOPLEFT")
|
||||
label:SetPoint("TOPRIGHT")
|
||||
label:SetJustifyH("CENTER")
|
||||
label:SetJustifyV("TOP")
|
||||
label:SetText(L["Click to search for an item.\nShift-Click to post at market value."])
|
||||
|
||||
TSMAPI.GUI:CreateHorizontalLine(frame, -(label:GetHeight()+5))
|
||||
|
||||
local stFrame = CreateFrame("Frame", nil, frame)
|
||||
stFrame:SetPoint("TOPLEFT", label, "BOTTOMLEFT", 0, -10)
|
||||
stFrame:SetPoint("BOTTOMRIGHT", 0, 30)
|
||||
TSMAPI.Design:SetFrameColor(stFrame)
|
||||
|
||||
local stHandlers = {
|
||||
OnClick = function(_, data)
|
||||
if IsShiftKeyDown() then
|
||||
if type(data.buyout) ~= "number" or data.buyout <= 0 then return end
|
||||
local bag, slot
|
||||
for b, s, itemString in TSMAPI:GetBagIterator() do
|
||||
if itemString == data.itemString then
|
||||
bag = b
|
||||
slot = s
|
||||
break
|
||||
end
|
||||
end
|
||||
if not bag or not slot then return end
|
||||
if not AuctionFrameAuctions.duration then
|
||||
-- Fix in case Blizzard_AuctionUI hasn't set this value yet (which could cause an error)
|
||||
AuctionFrameAuctions.duration = TSM.db.global.quickPostingDuration
|
||||
end
|
||||
PickupContainerItem(bag, slot)
|
||||
ClickAuctionSellItemButton(AuctionsItemButton, "LeftButton")
|
||||
StartAuction(data.buyout*TSM.db.global.postBidPercent, data.buyout, TSM.db.global.quickPostingDuration, 1, 1)
|
||||
TSM:Printf(L["Posted a %s with a buyout of %s."], data.link, TSMAPI:FormatTextMoney(data.buyout))
|
||||
|
||||
TSM:RegisterMessage("TSM_AH_EVENTS", function() TSMAPI:FireEvent("SHOPPING:QUICKPOST:POSTEDITEM", data) private.UpdateSTData(frame) end)
|
||||
TSMAPI:WaitForAuctionEvents("Post")
|
||||
else
|
||||
TSM.Search:StartFilterSearch(data.name.."/exact")
|
||||
end
|
||||
end,
|
||||
OnEnter = function(_, data, self)
|
||||
if not data then return end
|
||||
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
|
||||
TSMAPI:SafeTooltipLink(data.link)
|
||||
GameTooltip:Show()
|
||||
end,
|
||||
OnLeave = function()
|
||||
GameTooltip:ClearLines()
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
}
|
||||
local colInfo = {
|
||||
{name=L["Item"], width=0.56},
|
||||
{name=L["Num"], width=0.14, align="CENTER"},
|
||||
{name=L["Price"], width=0.3, align="RIGHT"},
|
||||
}
|
||||
frame.st = TSMAPI:CreateScrollingTable(stFrame, colInfo, stHandlers, 12)
|
||||
frame.st:DisableSelection(true)
|
||||
frame.st:DisableHighlight(true)
|
||||
|
||||
local checkBox = TSMAPI.GUI:CreateCheckBox(frame)
|
||||
checkBox:SetPoint("BOTTOMLEFT")
|
||||
checkBox:SetPoint("BOTTOMRIGHT")
|
||||
checkBox:SetHeight(30)
|
||||
checkBox:SetLabel(L["Hide Grouped Items"])
|
||||
checkBox:SetValue(TSM.db.global.quickPostingHideGrouped)
|
||||
checkBox:SetCallback("OnValueChanged", function(_, _, value)
|
||||
TSM.db.global.quickPostingHideGrouped = value
|
||||
private.UpdateSTData(frame)
|
||||
end)
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function private.UpdateSTData(frame)
|
||||
local items = {}
|
||||
for bag, slot, itemString, quantity in TSMAPI:GetBagIterator() do
|
||||
if not TSM.db.global.quickPostingHideGrouped or not TSMAPI:GetGroupPath(itemString) then
|
||||
items[itemString] = (items[itemString] or 0) + quantity
|
||||
end
|
||||
end
|
||||
|
||||
local stData = {}
|
||||
for itemString, quantity in pairs(items) do
|
||||
local name, link = TSMAPI:GetSafeItemInfo(itemString)
|
||||
if name then
|
||||
local buyout = TSM:GetMaxPrice(TSM.db.global.quickPostingPrice, itemString)
|
||||
local row = {
|
||||
cols = {
|
||||
{value=link},
|
||||
{value=quantity},
|
||||
{value=TSMAPI:FormatTextMoney(buyout) or "---"},
|
||||
},
|
||||
itemString = itemString,
|
||||
link = link,
|
||||
name = name,
|
||||
buyout = buyout,
|
||||
}
|
||||
tinsert(stData, row)
|
||||
end
|
||||
end
|
||||
sort(stData, function(a, b) return a.name < b.name end)
|
||||
frame.st:SetData(stData)
|
||||
end
|
||||
|
||||
do
|
||||
TSM:AddSidebarFeature(L["Quick Posting"], private.Create)
|
||||
end
|
||||
@@ -0,0 +1,159 @@
|
||||
local TSM = select(2, ...)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {}
|
||||
|
||||
StaticPopupDialogs["TSM_SHOPPING_SAVED_EXPORT_POPUP"] = {
|
||||
text = L["Press Ctrl-C to copy this saved search."],
|
||||
button1 = OKAY,
|
||||
OnShow = function(self)
|
||||
self.editBox:SetText(private.popupText)
|
||||
self.editBox:HighlightText()
|
||||
self.editBox:SetFocus()
|
||||
self.editBox:SetScript("OnEscapePressed", function() StaticPopup_Hide("TSM_SHOPPING_SAVED_EXPORT_POPUP") end)
|
||||
self.editBox:SetScript("OnEnterPressed", function() self.button1:Click() end)
|
||||
end,
|
||||
hasEditBox = true,
|
||||
timeout = 0,
|
||||
hideOnEscape = true,
|
||||
preferredIndex = 3,
|
||||
}
|
||||
StaticPopupDialogs["TSM_SHOPPING_SAVED_IMPORT_POPUP"] = {
|
||||
text = L["Paste the search you'd like to import into the box below."],
|
||||
button1 = L["Import"],
|
||||
button2 = CANCEL,
|
||||
OnShow = function(self)
|
||||
self.editBox:SetText("")
|
||||
self.editBox:HighlightText()
|
||||
self.editBox:SetFocus()
|
||||
self.editBox:SetScript("OnEscapePressed", function() StaticPopup_Hide("TSM_SHOPPING_SAVED_IMPORT_POPUP") end)
|
||||
self.editBox:SetScript("OnEnterPressed", function() self.button1:Click() end)
|
||||
end,
|
||||
OnAccept = function(self)
|
||||
local text = self.editBox:GetText():trim()
|
||||
if text ~= "" then
|
||||
tinsert(TSM.db.global.favoriteSearches, text)
|
||||
TSM:Printf(L["Added '%s' to your favorite searches."], text)
|
||||
private.UpdateSTData()
|
||||
end
|
||||
end,
|
||||
hasEditBox = true,
|
||||
timeout = 0,
|
||||
hideOnEscape = true,
|
||||
preferredIndex = 3,
|
||||
}
|
||||
|
||||
|
||||
function private.Create(parent)
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:Hide()
|
||||
frame:SetAllPoints()
|
||||
frame:SetScript("OnShow", private.UpdateSTData)
|
||||
private.frame = frame
|
||||
|
||||
local stHandlers = {
|
||||
OnClick = function(st, data, _, button)
|
||||
if not data or not data.search then return end
|
||||
if button == "LeftButton" then
|
||||
if IsShiftKeyDown() then
|
||||
private.popupText = data.search
|
||||
TSMAPI:ShowStaticPopupDialog("TSM_SHOPPING_SAVED_EXPORT_POPUP")
|
||||
else
|
||||
TSM.Search:StartFilterSearch(data.search)
|
||||
end
|
||||
elseif button == "RightButton" then
|
||||
if st == frame.recentST then
|
||||
if IsShiftKeyDown() then
|
||||
for i=#TSM.db.global.previousSearches, 1, -1 do
|
||||
if TSM.db.global.previousSearches[i] == data.search then
|
||||
tremove(TSM.db.global.previousSearches, i)
|
||||
end
|
||||
end
|
||||
TSM:Printf(L["Removed '%s' from your recent searches."], data.search)
|
||||
private.UpdateSTData()
|
||||
else
|
||||
tinsert(TSM.db.global.favoriteSearches, data.search)
|
||||
TSM:Printf(L["Added '%s' to your favorite searches."], data.search)
|
||||
private.UpdateSTData()
|
||||
end
|
||||
elseif st == frame.favoriteST then
|
||||
tremove(TSM.db.global.favoriteSearches, data.index)
|
||||
TSM:Printf(L["Removed '%s' from your favorite searches."], data.search)
|
||||
private.UpdateSTData()
|
||||
end
|
||||
end
|
||||
end,
|
||||
OnEnter = function(st, data, self)
|
||||
if not data or not data.search then return end
|
||||
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
|
||||
GameTooltip:AddLine(data.search, 1, 1, 1, true)
|
||||
GameTooltip:AddLine("")
|
||||
local color = TSMAPI.Design:GetInlineColor("link")
|
||||
if st == frame.recentST then
|
||||
GameTooltip:AddLine(color..L["Left-Click to run this search."], 1, 1, 1, true)
|
||||
GameTooltip:AddLine(color..L["Shift-Left-Click to export this search."], 1, 1, 1, true)
|
||||
GameTooltip:AddLine(color..L["Right-Click to favorite this recent search."], 1, 1, 1, true)
|
||||
GameTooltip:AddLine(color..L["Shift-Right-Click to remove this recent search."], 1, 1, 1, true)
|
||||
elseif st == frame.favoriteST then
|
||||
GameTooltip:AddLine(color..L["Left-Click to run this search."], 1, 1, 1, true)
|
||||
GameTooltip:AddLine(color..L["Shift-Left-Click to export this search."], 1, 1, 1, true)
|
||||
GameTooltip:AddLine(color..L["Right-Click to remove from favorite searches."], 1, 1, 1, true)
|
||||
end
|
||||
GameTooltip:Show()
|
||||
end,
|
||||
OnLeave = function()
|
||||
GameTooltip:ClearLines()
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
}
|
||||
|
||||
local recentSTParent = CreateFrame("Frame", nil, frame)
|
||||
recentSTParent:SetPoint("TOPLEFT")
|
||||
recentSTParent:SetPoint("TOPRIGHT")
|
||||
recentSTParent:SetPoint("BOTTOM", frame, "CENTER", 0, 4)
|
||||
TSMAPI.Design:SetFrameColor(recentSTParent)
|
||||
frame.recentST = TSMAPI:CreateScrollingTable(recentSTParent, {{name=L["Recent Searches"], width=1}}, stHandlers, 16)
|
||||
frame.recentST:DisableSelection(true)
|
||||
|
||||
local favoriteSTParent = CreateFrame("Frame", nil, frame)
|
||||
favoriteSTParent:SetPoint("BOTTOMLEFT", 0, 30)
|
||||
favoriteSTParent:SetPoint("BOTTOMRIGHT", 0, 30)
|
||||
favoriteSTParent:SetPoint("TOP", frame, "CENTER", 0, -4)
|
||||
TSMAPI.Design:SetFrameColor(favoriteSTParent)
|
||||
frame.favoriteST = TSMAPI:CreateScrollingTable(favoriteSTParent, {{name=L["Favorite Searches"], width=1}}, stHandlers, 16)
|
||||
frame.favoriteST:DisableSelection(true)
|
||||
|
||||
local importBtn = TSMAPI.GUI:CreateButton(frame, 18)
|
||||
importBtn:SetPoint("BOTTOMLEFT", 2, 2)
|
||||
importBtn:SetPoint("BOTTOMRIGHT", -2, 2)
|
||||
importBtn:SetPoint("TOPLEFT", favoriteSTParent, "BOTTOMLEFT", 2, -2)
|
||||
importBtn:SetText(L["Import Favorite Search"])
|
||||
importBtn:SetScript("OnClick", function()
|
||||
TSMAPI:ShowStaticPopupDialog("TSM_SHOPPING_SAVED_IMPORT_POPUP")
|
||||
end)
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
local function GetSTData(list)
|
||||
local stData = {}
|
||||
for i, search in ipairs(list) do
|
||||
local row = {
|
||||
cols = {{value=search}},
|
||||
search = search,
|
||||
index = i,
|
||||
}
|
||||
tinsert(stData, row)
|
||||
end
|
||||
return stData
|
||||
end
|
||||
|
||||
function private.UpdateSTData()
|
||||
if not private.frame then return end
|
||||
private.frame.recentST:SetData(GetSTData(TSM.db.global.previousSearches))
|
||||
private.frame.favoriteST:SetData(GetSTData(TSM.db.global.favoriteSearches))
|
||||
end
|
||||
|
||||
do
|
||||
TSM:AddSidebarFeature(L["Saved Searches"], private.Create, private.UpdateSTData)
|
||||
end
|
||||
@@ -0,0 +1,64 @@
|
||||
local TSM = select(2, ...)
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {}
|
||||
|
||||
function private.Create(parent)
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:Hide()
|
||||
frame:SetAllPoints()
|
||||
frame:SetScript("OnShow", private.UpdateSTData)
|
||||
frame:SetScript("OnUpdate", function(self)
|
||||
if #TSM.Util.shoppingLog ~= self.numLogEntries then
|
||||
private.UpdateSTData(self)
|
||||
end
|
||||
end)
|
||||
TSMAPI.Design:SetFrameColor(frame)
|
||||
|
||||
local stHandlers = {
|
||||
OnEnter = function(_, data, self)
|
||||
if not data then return end
|
||||
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
|
||||
TSMAPI:SafeTooltipLink(data.link)
|
||||
GameTooltip:Show()
|
||||
end,
|
||||
OnLeave = function()
|
||||
GameTooltip:ClearLines()
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
}
|
||||
local colInfo = {
|
||||
{name=L["Item"], width=0.40},
|
||||
{name=L["Action"], width=0.15, align="CENTER"},
|
||||
{name=L["Num"], width=0.13, align="CENTER"},
|
||||
{name=L["Buyout"], width=0.25, align="RIGHT"},
|
||||
}
|
||||
frame.st = TSMAPI:CreateScrollingTable(frame, colInfo, stHandlers, 12)
|
||||
frame.st:DisableSelection(true)
|
||||
frame.st:DisableHighlight(true)
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function private.UpdateSTData(frame)
|
||||
local stData = {}
|
||||
for i=#TSM.Util.shoppingLog, 1, -1 do
|
||||
local entry = TSM.Util.shoppingLog[i]
|
||||
local row = {
|
||||
cols = {
|
||||
{value=entry.link},
|
||||
{value=entry.action},
|
||||
{value=entry.count},
|
||||
{value=TSMAPI:FormatTextMoney(entry.buyout)},
|
||||
},
|
||||
link = entry.link
|
||||
}
|
||||
tinsert(stData, row)
|
||||
end
|
||||
frame.st:SetData(stData)
|
||||
frame.numLogEntries = #TSM.Util.shoppingLog
|
||||
end
|
||||
|
||||
do
|
||||
TSM:AddSidebarFeature(L["Log"], private.Create)
|
||||
end
|
||||
@@ -0,0 +1,82 @@
|
||||
local TSM = select(2, ...)
|
||||
local Sidebar = TSM:NewModule("Sidebar", "AceEvent-3.0")
|
||||
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_Shopping") -- loads the localization table
|
||||
|
||||
local private = {pages={}, order={}, createFunctions={}, updateFunctions={}, currentPage=nil}
|
||||
|
||||
|
||||
function Sidebar:Show(parent)
|
||||
private.frame = private.frame or private:CreateSidebar(parent)
|
||||
private.frame:Show()
|
||||
end
|
||||
|
||||
function Sidebar:Hide()
|
||||
if not private.frame then return end
|
||||
private.frame:Hide()
|
||||
end
|
||||
|
||||
function private:CreateSidebar(parent)
|
||||
TSM.Util:ShowSearchFrame(nil, L["% Market Value"])
|
||||
local frame = CreateFrame("Frame", nil, parent)
|
||||
frame:SetPoint("TOPLEFT", parent, "TOPRIGHT", 2, 0)
|
||||
frame:SetPoint("BOTTOMLEFT", parent, "BOTTOMRIGHT", 2, 0)
|
||||
frame:SetWidth(300)
|
||||
TSMAPI.Design:SetFrameBackdropColor(frame)
|
||||
|
||||
local content = CreateFrame("Frame", nil, frame)
|
||||
content:SetPoint("TOPLEFT", 5, -5)
|
||||
content:SetPoint("BOTTOMRIGHT", -5, 5)
|
||||
frame.content = content
|
||||
|
||||
for label, func in pairs(private.createFunctions) do
|
||||
frame.content[label] = func(content)
|
||||
frame.content[label]:Hide()
|
||||
end
|
||||
private.currentPage = private.currentPage or private.order[1]
|
||||
frame.content[private.currentPage]:Show()
|
||||
|
||||
return frame
|
||||
end
|
||||
|
||||
function Sidebar:AddSidebarFeature(label, createFunc, updateFunc)
|
||||
private.pages[label] = label
|
||||
private.createFunctions[label] = createFunc
|
||||
private.updateFunctions[label] = updateFunc
|
||||
tinsert(private.order, label)
|
||||
end
|
||||
|
||||
function Sidebar:UpdateCurrentFrame()
|
||||
if private.currentPage and private.updateFunctions[private.currentPage] then
|
||||
private.updateFunctions[private.currentPage]()
|
||||
end
|
||||
end
|
||||
|
||||
function Sidebar:GetPages()
|
||||
return private.order
|
||||
end
|
||||
|
||||
function Sidebar:ButtonClick(key)
|
||||
for i in pairs(private.pages) do
|
||||
private.frame.content[i]:Hide()
|
||||
end
|
||||
private.frame.content[key]:Show()
|
||||
private.currentPage = key
|
||||
end
|
||||
|
||||
function Sidebar:GetCurrentPage()
|
||||
if not private.frame or not private.frame:IsVisible() then return end
|
||||
|
||||
if private.currentPage == L["Saved Searches"] then
|
||||
return "saved"
|
||||
elseif private.currentPage == L["TSM Groups"] then
|
||||
return "groups"
|
||||
elseif private.currentPage == L["Log"] then
|
||||
return "log"
|
||||
elseif private.currentPage == L["Quick Posting"] then
|
||||
return "quick"
|
||||
elseif private.currentPage == L["Custom Filter"] then
|
||||
return "custom"
|
||||
elseif private.currentPage == OTHER then
|
||||
return "other"
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user