Hyperlinks

Hyperlinks are clickable (chat) links. They are implemented in FrameXML/ItemRef.lua. Note that for use in () it can reject invalid entries, as the server may expect certain combinations of color, payload and text.
==Format==
Each hyperlink has the following format:
 |cffxxxxxx|Htype:payload|h[text]|h|r
Text 	Description
cffxxxxxx 	The color code
H 	Begins the hyperlink
type:payload	The link type and any colon-delimited params
h 	Marks the end of the payload
[text] 	Localized display text
h 	Ends the hyperlink
r 	Stops coloring
==Inspecting==
: See also: ExtractHyperlinkString()
There are multiple ways to see the contents of a hyperlink:
* From the in-game chat window.
 /dump "[Flash Heal]"
 > "|cff71d5ff|Hspell:2061:0|h[Flash Heal]|h|r"
* From an addon, when clicking a hyperlink in-game.
hooksecurefunc("SetItemRef", function(link, text)
	print(link, text:gsub("|", "||"))
end)
> "spell:139:0", "|cff71d5ff|Hspell:139:0|h[Renew]|h|r"
== Types ==
=== achievement ===
 achievement : achievementID : guid : completed : month : day : year : criteria1 : criteria2 : criteria3 : criteria4
* guid The player's GUID.
* completed 1 for earned, 0 for unearned achievements.
* month:day:year Date the achievement was earned or 0:0:-1 if not earned.
* criteria1-4 32-bit bitmask fields for completed criteria, or 0:0:0:0 if not completed.
: Example:
: "|cffffff00|Hachievement:10671:Player-1096-06DF65C1:1:2:16:17:4294967295:4294967295:4294967295:4294967295|h[Level 110]|h|r"
: "|cffffff00|Hachievement:12544:Player-1096-06DF65C1:0:0:0:-1:0:0:0:0|h[Level 120]|h|r"
=== addon ===
Generic link type for use by addons. Links with an "addon" type are local-only and cannot be sent in chat messages, and can be processed by addons by securely hooking SetItemRef().
 addon : name : data
* name Arbitrary addon data.
* data Arbitrary colon-delimited addon data segments.
: Example:
: "|cff71d5ff|Haddon:SuperAuras:some:data:1234|h[SuperAuras: The Link!]|h|r"
hooksecurefunc("SetItemRef", function(link)
	local linkType, addon, param1 = strsplit(":", link)
	if linkType == "addon" and addon == "SomeAddon" then
		if param1 == "foo" then
			print(link)
		end
	end
end)
 print("|cFFFFFF00|Haddon:SomeAddon:foo|h[Some Clickable Message]|h|r")
=== api ===
Shows API Documentation from the /api command.
 api : type : name : [parentName]
: Example:
: "|cffff55dd|Hapi:system:MapUI:|hMapUI|h|r"
: "|cff55ddff|Hapi:function:GetMapInfo:MapUI|hC_Map.GetMapInfo()|h|r"
: "|cff77ff22|Hapi:event:ZoneChanged:MapUI|hEvent.MapUI.ZoneChanged|h|r"
: "|cff55ffdd|Hapi:table:UiMapDetails:MapUI|hUiMapDetails|h|r"
=== azessence ===
:Azerite Essence link
 azessence : essenceID : rank
: Example: "|cffa335ee|Hazessence:12:3|h[The Crucible of Flame]|h|r"
: See also: ()
=== battlepet ===
 battlepet : speciesID : level : breedQuality : maxHealth : [power] : [speed] : [battlePetID] : [displayID]
: Example: "|cff0070dd|Hbattlepet:202:25:3:1546:289:260:BattlePet-0-00000338F951:16189|h[Baby Blizzard Bear]|h|r"
: Barebone example: /run SendChatMessage("\124cff1eff00\124Hbattlepet:202:1:2:1:::BattlePet--:\124h[Baby Blizzard Bear]\124h\124r")
: See also: BattlePetSpeciesID
=== battlePetAbil ===
 battlePetAbil : abilityID : maxHealth : power : speed
: Example: "|cff4e96f7|HbattlePetAbil:348:1435:267:240|hBash|h|r"
=== calendarEvent ===
 calendarEvent : monthOffset : monthDay : index
: Example: "|HcalendarEvent:0:12:1|hSpring Balloon Festival|h"
: See also: ()
=== channel ===
Opens the chat window to a specific /channel.
 channel : channelType : [channelID]
: Example:
: "|Hchannel:channel:2|h[2. Trade - City]|h"
: "|Hchannel:PARTY|h[Party]|h"
=== clubFinder ===
Guild Finder (8.2.5) invite link.
 clubFinder : clubFinderId
: Example: "|cffffd100|HclubFinder:ClubFinder-1-19160-1598-53720920|h[Guild: Happy Leveling]|h|r"
: See also: GetClubFinderLink()
=== clubTicket ===
WoW communities & Blizzard Groups invite link.
 clubTicket : ticketId
: Example: "|cffffd100|HclubTicket:oxPbMfv2R|h[Join: test]|h|r"
: See also: GetClubTicketLink()
=== community ===
Community link in Quick Join requests.
 community : clubId
=== conduit ===
Conduit link
 conduit : id : [rank]
: Example: "|cff71d5ff|Hconduit:5:1|h[Stalwart Guardian]|h|r"
: See also: ()
=== currency ===
 currency : id : [amount]
: Example: "|cffffffff|Hcurrency:1744|h[Corrupted Memento]|h|r"
: See also: ()
=== death ===
Opens the Death recap overview.
 death : recapID
: Example: "|Hdeath:1|h[You died.]|h"
=== dungeonScore ===
Shows Mythic+ stats for a player in the tooltip.
: Example: "|cffffd100|HdungeonScore:2723:Player-1403-068056BB:Numedain:6:278:60:124:2723:3:381:1:15:382:1:17:392:1:18:391:1:18:380:1:17:375:1:18:376:0:18:377:1:17:378:1:19:379:1:16|h[Mythic+ Rating]|h|r"
: See also DisplayDungeonScoreLink()
 1: 2723 -- score
 2: Player-1403-068056BB -- guid
 3: Numedain -- name
 4: 6 -- classId: Death Knight
 5: 278 -- itemLevel
 6: 60 -- playerLevel
 7: 124 -- runsThisSeason
 8: 2723 -- bestSeasonScore
 9: 3 -- bestSeasonNumber
 
10: 381 -- mapChallengeModeID: Spires of Ascension
11: 1 -- completedInTime
12: 15 -- keystoneLevel
13: 382 -- Theater of Pain
14: 1
15: 17
16: 392	 -- Tazavesh: So'leah's Gambit
17: 1
18: 18
19: 391 -- Tazavesh: Streets of Wonder
20: 1
21: 18
22: 380 -- Sanguine Depths
23: 1
24: 17
25: 375 -- Mists of Tirna Scithe
26: 1
27: 18
28: 376 -- The Necrotic Wake
29: 0
30: 18
31: 377 -- De Other Side
32: 1
33: 17
34: 378 -- Halls of Atonement
35: 1
36: 19
37: 379 -- Plaguefall
38: 1
39: 16
=== enchant ===
Opens the Tradeskill window for a recipe.
 enchant : spellID
: Example: "|cffffd000|Henchant:162206|h[Draenor Engineering: World Shrinker]|h|r"
=== garrfollower ===
 garrfollower : followerID : quality : level : itemLevel : ability1 : ability2 : ability3 : ability4 : trait1 : trait2 : trait3 : trait4 : spec1
: Example: "|cffa335ee|Hgarrfollower:856:4:110:900:457:777:0:0:684:758:0:0:354|h[Calia Menethil]|h|r"
=== garrfollowerability ===
 garrfollowerability : abilityID
: Example:
: "|cff4e96f7|Hgarrfollowerability:354|h[Discipline]|h|r"
: "|cff4e96f7|Hgarrfollowerability:457|h[Holy Nova]|h|r"
=== garrmission ===
 garrmission : missionID : missionDBID
: Example: "|cffffff00|Hgarrmission:1610:000000000238f82d|h[Withered Straining]|h|r"
=== instancelock ===
Opens the /raidinfo list.
 instancelock : guid : instanceID : difficulty : defeatedEncounters
* guid The player's GUID.
* instanceID The instance's InstanceID
* difficulty The instance's DifficultyID
* defeatedEncounters Bitfield indicating the encounters that have been defeated. e.g. 7 means that the first 3 encounters have been cleared.
: Example: "|cffff8000|Hinstancelock:Player-3296-000957C8:543:2:4|h[Hellfire Citadel: Ramparts]|h|r"
=== item ===
 item : itemString
: Example: "|cffffffff|Hitem:2592::::::::::::::::::|h[Wool Cloth]|h|r"
=== journal ===
Opens the Adventure Guide.
 journal : journalType : journalID : difficulty
* journalType 0=Instance, 1=Encounter, 2=Section.
* journalID InstanceID, EncounterID, or SectionID.
* difficulty DifficultyID of the instance.
: Example:
: "|cff66bbff|Hjournal:0:1031:14|h[Uldir]|h|r"
: "|cff66bbff|Hjournal:1:2147:14|h[G'huun]|h|r"
: "|cff66bbff|Hjournal:2:18068:14|h[Titan Spark]|h|r"
: See also: ()
=== keystone ===
Used for Mythic Keystone.
 keystone : itemID : challengeModeID : level : affix1 : affix2 : affix3 : affix4
: Example:
: "|cffa335ee|Hkeystone:180653:381:2:10:0:0:0|h[Keystone: Spires of Ascension (2)]|h|r"
: "|cffa335ee|Hkeystone:180653:375:15:10:8:12:121|h[Keystone: Mists of Tirna Scithe (15)]|h|r"
: "|cffa335ee|Hkeystone:180653:379:18:10:8:12:121|h[Keystone: Plaguefall (18)]|h|r"
: See also: MapChallengeMode.db2, KeystoneAffix.db2
	[138019] = "Mythic Keystone", -- Legion Keystone
	[151086] = "Mythic Invitational Keystone", -- Tournament Stone
	[158923] = "Mythic Keystone", -- BFA Keystone
	[180653] = "Mythic Keystone", -- SL & DF Keystone
	[187786] = "Timeworn Keystone", -- Legion Timestone
=== levelup ===
 levelup : level : levelUpType : [petName]
: Example:
: "|cffFF4E00|Hlevelup:2:LEVEL_UP_TYPE_CHARACTER|h[Level 2]|h|r"
: "|cffFF4E00|Hlevelup:2:LEVEL_UP_TYPE_PET:Bear|h[Level 2]|h|r"
=== lootHistory ===
Opens the /loot window.
 lootHistory : rollID
=== mawpower ===
 mawpower : id
: Example: "|cff71d5ff|Hmawpower:358|h[Icy Heartcrust]|h|r"
: See also: MawPower.db2
=== outfit===
Shows a transmog in the dressing room.
 outfit : payload
: Example: [[|cffff80ff|Houtfit:"a;"aA%ib"a>!.h&Ul"uH"a8"v""a@"v<"a"!!!!5o!!!!!!!!!|h[|T1598183:13:13:-1:0|tOutfit]|h|r]]
Decoding the payload  
-- tries to do partly what C_TransmogCollection.GetItemTransmogInfoListFromOutfitHyperlink() already does
-- it doesn't map to the proper inventorySlotIDs and appearanceID/secondaryAppearanceID/illusionID keys
-- there is no practical reason to actually do this
--local key = [[!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{]]
local keySize = 91
local asciiOffset = 33
local groupSize = 3
local function ParseOutfitLink(link)
	local payload = link:match("|Houtfit:(.-)|h")
	local t = {}
	for i = 1, #payload, groupSize do
		local group = payload:sub(i, i+groupSize-1)
		local sum = 0
		for j = 1, #group do
			local a = group:byte(j) - asciiOffset 
			local b = math.pow(keySize, groupSize-j)
			sum = sum + a*b
		end
		table.insert(t, sum)
	end
	return t
end
local info = ParseOutfitLink([[|cffff80ff|Houtfit:"a;"aA%ib"a>!.h&Ul"uH"a8"v""a@"v<"a"!!!!5o!!!!!!!!!|h[|T1598183:13:13:-1:0|tOutfit]|h|r]])
DevTools_Dump(info)
--[[
	[1] = 14131, -- 1: INVSLOT_HEAD						Cowl of Absolution
	[2] = 14137, -- 13: INVSLOT_SHOULDER					Mantle of Absolution
	[3] = 39741, -- 15: INVSLOT_BACK						Cloak of the Darkmoon Faire
	[4] = 14134, -- 5: INVSLOT_CHEST						Vestments of Absolution
	[5] = 1254, -- 4: INVSLOT_BODY						Stylish Black Shirt
	[6] = 35447, -- 19: INVSLOT_TABARD						Theramore Tabard
	[7] = 15964, -- 9: INVSLOT_WRIST						Cuffs of Absolution
	[8] = 14128, -- 10: INVSLOT_HAND						Gloves of Absolution
	[9] = 16017, -- 6: INVSLOT_WAIST						Belt of Absolution
	[10] = 14136, -- 7: INVSLOT_LEGS						Breeches of Absolution
	[11] = 16043, -- 8: INVSLOT_FEET						Boots of Absolution
	[12] = 14106, -- 16: INVSLOT_MAINHAND	appearanceID	Staff of the Redeemer
	[13] = 0, -- 17: INVSLOT_OFFHAND	appearanceID
	[14] = 1898, -- 16: INVSLOT_MAINHAND	illusionID		Illusion: Lifestealing
	[15] = 0, -- 17: INVSLOT_OFFHAND	illusionID
	[16] = 0, -- 16: INVSLOT_MAINHAND	secondaryAppearanceID
	[17] = 0 -- 3: INVSLOT_SHOULDER	secondaryAppearanceID
]]
This can also be in a non-hyperlink format.
 /outfit v1 14131,14137,0,39741,14134,1254,46212,15964,14128,16017,14136,16043,14106,-1,1898,0,0
: See also: (), TransmogUtil.ParseOutfitSlashCommand()
=== player ===
: Left-click: starts a whisper message
: Right-click: opens the player context menu
: Shift-click: sends a /who query
 player : name : [lineID] : [chatType] : [chatTarget]
* lineID Message ID for reporting.
: Example:
: "|Hplayer:Fadeshift|h[Fadeshift]|h"
: "|Hplayer:Aquadoll-MoonGuard|h[Aquadoll]|h"
: "|Hplayer:Ketho-Anasterian:8:PARTY:|h[|cfffefefeKetho|r]|h"
: "|Hplayer:Kilastra-DefiasBrotherhood:90:CHANNEL:2|h[|cff8686ecKilastra|r]|h"
: See also: GetPlayerLink()
=== playerCommunity ===
 playerCommunity : name : communityClubID : communityStreamID : communityEpoch : communityPosition
: Example: "|HplayerCommunity:Ketho-Anasterian:333281:1:1557794365297000:5886997898769|h[|cfffefefeKetho|r]|h"
=== BNplayer ===
Battle.net friend links.
 BNplayer : name : bnetIDAccount : lineID : chatType : chatTarget
=== BNplayerCommunity ===
 BNplayerCommunity : name : bnetIDAccount : communityClubID : communityStreamID : communityEpoch : communityPosition
=== quest ===
 quest : questID : questLevel : unknown1 : unknown2 : unknown3
: Example:
: "|cffffff00|Hquest:53370:-1:110:120:3|h[Hour of Reckoning]|h|r"
: "|cffff8040|Hquest:40746:113:110:255:0|h[One of the People]|h|r"
: See also: QuestLink
=== shareachieve ===
Opens the Twitter /share window for an achievement.
 shareachieve : achievementID : earned
: Example: "|cffffd200|Hshareachieve:964:1|h|TInterface\ChatFrame\UI-ChatIcon-Share:18:18|t|h|r"
=== shareitem ===
Twitter item link.
 shareitem : itemLink : earned
: Example: "|cffffd200|Hshareitem:151428::::::::20:257:512:1:1:4068:20::::1|h|TInterface\ChatFrame\UI-ChatIcon-Share:18:18|t|h|r"
=== sharess ===
Twitter screenshot link.
 sharess : screenshotIndex
* screenshotIndex: index of the screenshot to autofill the Tweet with, counted from last login.
: Example: "|cffffd200|Hsharess:1|h|TInterface\ChatFrame\UI-ChatIcon-Share:18:18|t|h|r"
=== spell ===
 spell : spellId : glyphId : [event]
: Example:
: "|cff71d5ff|Hspell:2096:0|h[Mind Vision]|h|r"
: "|Hspell:589:0:SPELL_DAMAGE|hShadow Word: Pain|h" (as printed in Blizzard_CombatLog)
: See also: ()
=== storecategory ===
Opens the In-Game Store.
 storecategory : category
: Example: "|cffffd000|Hstorecategory:games|h[Click To Upgrade]|h|r"
=== talent ===
 talent : talentID
: Example: "|cff71d5ff|Htalent:21754|h[Circle of Healing]|h|r"
: See also: ()
 talent : talentID : points
: Note that -1 = 0 points, 0 = 1 point, 1 = 2 points, etc.
: Example: "|cff4e96f7|Htalent:406:1|h[Improved Renew]|h|r"
=== talentbuild ===
 Opens the Talent Tree UI with a read-only view of the linked loadout.
 talentbuild : specializationID : level : talentLoadoutImportString
* specializationID The loadout's SpecializationID.
* level The loadout's level.
* talentLoadoutImportString The loadout import string.
: Example: "|cffa330c9|Htalentbuild:577:70:BEkAAAAAAAAAAAAAAAAAAAAAAIBkQKRSaJJJSEIAAAAAAAaJJQLFSSKSi0QRSSSSSA|h[Talents: Havoc Demon Hunter]|h|r"
: See also: Dragonflight Talent System
=== trade ===
Shows the tradeskill window (from another player).
 trade : guid : spellID : skillLineID
* guid The player's GUID.
* spellID The tradeskill's Spell ID.
* skillLineID The TradeSkillLineID.
: Example: "|cffffd000|Htrade:Player-3296-000957C8:195128:185|h[Cooking]|h|r"
: See also: TradeSkillLink
=== transmogappearance ===
Shows the transmog item in the Appearances tab.
 transmogappearance : id
: Example: |cffff80ff|Htransmogappearance:112825|h[Staff of the Penitent]|h|r
=== transmogillusion ===
Previews a weapon enchant in the Dressing room.
 transmogillusion : sourceID
: Example: "|cffff80ff|Htransmogillusion:5862|h[Titanguard]|h|r"
: See also: ()
=== transmogset ===
Shows the transmog set in the Appearances tab.
 transmogset : setID
: Example: "|cffff80ff|Htransmogset:1414|h[Fierce Gladiator's Satin Armor (Gladiator)]|h|r"
: See also: ()
=== unit ===
Shows the unit tooltip. Opens the combat log context menu on right-click.
 unit : guid : [name]
: Example: "|Hunit:Creature-0-2083-0-7-299-00005A0F91:Young Wolf|hYoung Wolf|h"
Implemented in Blizzard_CombatLog.lua
=== urlIndex ===
Opens a URL in the default web browser.
 urlIndex : index
: Example: "|HurlIndex:25|h|cff006995Frequently Asked Questions|r|h"
=== worldmap ===
Opens the World Map to display a pinned waypoint.
 worldmap : uiMapID : x : y
* uiMapID The UiMapID for the waypoint.
* x The X coordinate of the waypoint, multiplied by 10000.
* y The Y coordinate of the waypoint, multiplied by 10000.
: Example: "|cffffff00|Hworldmap:84:7222:2550|h[|A:Waypoint-MapPin-ChatIcon:13:13:0:0|a Map Pin Location]|h|r"
: enUS globalstring: MAP_PIN_HYPERLINK = "|A:Waypoint-MapPin-ChatIcon:13:13:0:0|a Map Pin Location"
: See also: ()
==== Note ====
Any changes to the hyperlink's color, image or text will prevent it from being sent over SendChatMessage. The only changes allowed are map and coordinates.
==See also==
* ()
==Patch changes==
* 
*