TradeSkillLink

== tradeSkillLink API Type (String) ==
tradeSkillLinks are returned by GetTradeSkillListLink().
== Anatomy of a tradeSkillLink ==
NEWEST Encoding (5.4):
 |cffffd000|Htrade:010000000000D4C3:2550:333|h[Cooking]|h|r
NEW Encoding (5.3):
 |cffffd000|Htrade:010000000000D4C3:2550:580:600:2/7/////7/9////9//7//////////////37/////D:982:0:0:A:981:0:0:A:980:0:0:AA:979:600:600:/:978:600:600:/:977:600:600:/:976:600:600:/:975:600:600:/|h[Cooking]|h|r
OLD Encoding (5.2 and earlier):
 |cffffd000|Htrade:2550:580:600:010000000000D4C3:2/7/////7/9////9//7//////////////37/////D|h[Cooking]|h|r
* "|cffffd000" - Colorizes the link (see itemLink)
* "|H" - Hyperlink introduction
* "trade:" - Indicates a tradeskill Hyperlink
* "2550" - Tradeskill Spell ID
* "580" - Current skill level
* "600" - Maximum skill level without further training
* "333" - Unknown
* "010000000000D4C3" - Character GUID
* "2/7/////7/9////9//7//////////////37/////D" - Recipe list (see below): REMOVED in 5.4
* "975:600:600:/"x8 - Descriptor for each trade specialization (currently only for Cooking and omitted for other trade spells). Fields are specid:specrank:specrankmax:specrecipedata: REMOVED in 5.4
* "|h" - Hyperlink data concluded, text follows
* "[Cooking]" - Display text
* "|h" - Hyperlink conclusion
* "|r" - Returns color to normal
== Tradeskill IDs ==
The tradeskill ID is the same as the global spell ID for the tradeskill ability. This is the same number returned from API GetSpellLink, and can be passed to API GetSpellInfo. It seems that the ID therefore changes with the rank of the trade skill. For example, an Apprentice Alchemist will link with trade:2259 but a Grand Master will link trade:51304.
== Recipe list ==
The recipe list portion of the tradeSkillLink is a bitset representing which recipes are available.
Example
If the recipe list portion of a tradeSkillLink is:
 ZAAAAAAAgAAAAAAAgAAAAA
Then the recipe list bitset is:
 100110000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000001[... zeroes]
This set indicates that four (4) specific recipes are available (note that there are 5 bits; there is no information on why there is an extra bit at this time). Also note that the bitset is unique for each tradeskill; a recipe denoted by bit N in one tradeskill is not the same as a recipe denoted by bit N in another tradeskill.
The bitset is encoded into standard Base64, using the characters A-Z, a-z, 0-9, +, and /. Being Base64, there are 6 bits per digit (similar to how hexadecimal has 4 bits per digit); this allows one to easily determine if a specific bit is set by looking only at a single digit in the string.
TODO: Document bitfield ordering, perhaps by looking at Maldivia's TradeLinks addon
== Bitsets to Spell IDs ==
To convert a bitset to a list of known skill spell IDs, look in SkillLineAbility.dbc. Get the lines for your given SkillLineID (column 2), then sort numerically by minSkillLineRank (column 8) ascending, then by SkillLineAbilityID (column 1) ascending. Your spell IDs are in order in column 3, and a set bit in your bitstring corresponds to knowing the spell ID in that position. Column positions are accurate as of this writing (Patch 3.3.3) but may change in future patches.
== Bit Maps ==
These provide bitmaps for 3.1 with all the in-game professions. (please verify these are based on standard Base64)
*Cooking
 2/7///7///9////7//////////g+/B
*First Aid
 8bffAA
== Link Checking ==
The server does a GUID check on the tradeSkillLink. As such, these links won't work cross-servers, but they do work cross-faction.
The server doesn't check between the tradeskill rank, current/max skill, and the recipe list.
If a tradeSkillLink does not pass these checks, it'll fail silently.
== Notes ==
* tradeSkillLink encoding changed significantly in Patch 5.3. The first four fields were re-arranged, and specialization data was added for Cooking.
* It is easy to view a tradeSkillLink in its raw form by opening a tradeskill window and running the command
 /script DEFAULT_CHAT_FRAME:AddMessage(gsub(GetTradeSkillListLink(), "\124", "\124\124"))
* Maldivia's TradeLinks addon can create custom tradelinks.
* Gnomish Yellow Pages provides examples with full bitmaps, and stores data based on bitmap.
* C# TradeSkillList Recipe List Decode forum post showing example code in C# to decode recipe list.
* WowTradeShare is a website where players can post and search tradelinks collected by the TradeShare addon.