This commit is contained in:
Andrew6810
2022-11-05 21:19:42 -07:00
parent b79f4bd588
commit f3e579cb57
386 changed files with 93729 additions and 2 deletions
+193
View File
@@ -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!
+21
View File
@@ -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
+154
View File
@@ -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
+161
View File
@@ -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
+154
View File
@@ -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."] = ""
+154
View File
@@ -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."] = ""
+154
View File
@@ -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."] = ""
+154
View File
@@ -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
+156
View File
@@ -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."] = ""
+155
View File
@@ -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."] = ""
+156
View File
@@ -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."] = "在正常模式下,你可以在拍卖行进行简单筛选的搜索。"
+154
View File
@@ -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
+459
View File
@@ -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
+259
View File
@@ -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
+159
View File
@@ -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