From 08deab469ffc322a6dd8ae20a6b856fb4c7d53ae Mon Sep 17 00:00:00 2001 From: Brues <5278969+brues-code@users.noreply.github.com> Date: Sat, 8 Aug 2026 01:21:46 -0500 Subject: [PATCH] Read friend and who class tokens from C_FriendList Use C_FriendList.GetFriendInfoByIndex and GetWhoInfo in the social lists, the friends panel tooltip, and the unit scan. Both return the class token directly (classFilename / filename), so the localized class name no longer needs a reversal through L["class"]. Color friend names with the class ColorMixin's WrapTextInColorCode. --- libs/libunitscan.lua | 21 ++++--- modules/panel.lua | 12 ++-- modules/socialmod.lua | 130 +++++++++++++++++++++--------------------- 3 files changed, 80 insertions(+), 83 deletions(-) diff --git a/libs/libunitscan.lua b/libs/libunitscan.lua index ad00ed8c..fed17d81 100644 --- a/libs/libunitscan.lua +++ b/libs/libunitscan.lua @@ -96,13 +96,12 @@ libunitscan:SetScript("OnEvent", function() RememberByUnit("player", name, class) elseif event == "FRIENDLIST_UPDATE" then - local name, class, level for i = 1, GetNumFriends() do - name, level, class = GetFriendInfo(i) - class = L["class"][class] or nil - -- friendlist updates due to friend going off-line return level 0, let's not overwrite good older values - level = level > 0 and level or nil - AddData("players", name, class, level) + local info = C_FriendList.GetFriendInfoByIndex(i) + if info then + local level = info.level > 0 and info.level or nil + AddData("players", info.name, info.classFilename, level) + end end elseif event == "GUILD_ROSTER_UPDATE" then @@ -137,11 +136,11 @@ libunitscan:SetScript("OnEvent", function() end elseif event == "WHO_LIST_UPDATE" or event == "CHAT_MSG_SYSTEM" then - local name, class, level, guild, _ - for i = 1, GetNumWhoResults() do - name, guild, level, _, class, _ = GetWhoInfo(i) - class = L["class"][class] or nil - AddData("players", name, class, level, nil, guild) + for i = 1, C_FriendList.GetNumWhoResults() do + local info = C_FriendList.GetWhoInfo(i) + if info then + AddData("players", info.fullName, info.filename, info.level, nil, info.fullGuildName) + end end elseif event == "UPDATE_MOUSEOVER_UNIT" or event == "PLAYER_TARGET_CHANGED" or event == "NAME_PLATE_UNIT_ADDED" then diff --git a/modules/panel.lua b/modules/panel.lua index d7d38c3a..39bfe6f6 100644 --- a/modules/panel.lua +++ b/modules/panel.lua @@ -296,18 +296,18 @@ pfUI:RegisterModule("panel", function() local playerzone = GetRealZoneText() for friendIndex=1, all do - local friend_name, friend_level, friend_class, friend_area, friend_connected = GetFriendInfo(friendIndex) - if friend_connected and friend_class and friend_level then + local info = C_FriendList.GetFriendInfoByIndex(friendIndex) + if info and info.connected and info.classFilename and info.level then if not init then GameTooltip_SetDefaultAnchor(GameTooltip, this) GameTooltip:ClearLines() GameTooltip:AddLine("|cff555555" .. T["Friends Online"]) init = true end - local ccolor = PFUI_CLASS_COLORS[L["class"][friend_class]] - local lcolor = GetDifficultyColor(tonumber(friend_level)) or { 1, 1, 1 } - local zcolor = friend_area == playerzone and "|cff33ffcc" or "|cffcccccc" - GameTooltip:AddDoubleLine(rgbhex(ccolor) .. friend_name .. rgbhex(lcolor) .. " [" .. friend_level .. "]", zcolor .. friend_area) + local ccolor = PFUI_CLASS_COLORS[info.classFilename] + local lcolor = GetDifficultyColor(tonumber(info.level)) or { 1, 1, 1 } + local zcolor = info.area == playerzone and "|cff33ffcc" or "|cffcccccc" + GameTooltip:AddDoubleLine(ccolor:WrapTextInColorCode(info.name) .. rgbhex(lcolor) .. " [" .. info.level .. "]", zcolor .. info.area) end end diff --git a/modules/socialmod.lua b/modules/socialmod.lua index 4cf14cf3..b13a660d 100644 --- a/modules/socialmod.lua +++ b/modules/socialmod.lua @@ -77,20 +77,19 @@ pfUI:RegisterModule("socialmod", function () local off = FauxScrollFrame_GetOffset(FriendsFrameFriendsScrollFrame) for i=1, FRIENDS_TO_DISPLAY do - local name, level, class, zone, connected, status = GetFriendInfo(off + i) - if not name or name == _G.UNKNOWN then break end + local info = C_FriendList.GetFriendInfoByIndex(off + i) + if not info or not info.name or info.name == _G.UNKNOWN then break end + local name = info.name local friendName = _G["FriendsFrameFriendButton"..i.."ButtonTextName"] local friendLoc = _G["FriendsFrameFriendButton"..i..FRIENDS_NAME_LOCATION] local friendInfo = _G["FriendsFrameFriendButton"..i.."ButtonTextInfo"] local caption = friendName or friendLoc - if connected then - if not class or class == _G.UNKNOWN then break end - local ccolor = PFUI_CLASS_COLORS[L["class"][class]] or { 1, 1, 1 } - local lcolor = GetDifficultyColor(tonumber(level)) or { 1, 1, 1 } - - zone = ( zone == playerzone and "|cffffffff" or "|cffcccccc" ) .. zone .. "|r" - local cname = rgbhex(ccolor) .. name .. "|r" + if info.connected then + local ccolor = PFUI_CLASS_COLORS[info.classFilename] + local status = info.afk and CHAT_FLAG_AFK or info.dnd and CHAT_FLAG_DND or "" + local zone = ( info.area == playerzone and "|cffffffff" or "|cffcccccc" ) .. info.area .. "|r" + local cname = ccolor:WrapTextInColorCode(name) if playerdb[name] then playerdb[name].lastseen = date("%a %d-%b-%Y") playerdb[name].cname = cname @@ -103,7 +102,7 @@ pfUI:RegisterModule("socialmod", function () friendLoc:SetText(format(TEXT(FRIENDS_LIST_TEMPLATE), cname, zone, status)) end - friendInfo:SetText(format(TEXT(FRIENDS_LEVEL_TEMPLATE), level, class)) + friendInfo:SetText(format(TEXT(FRIENDS_LEVEL_TEMPLATE), info.level, info.className)) caption:SetVertexColor(1,1,1,.9) friendInfo:SetVertexColor(1,1,1,.9) else @@ -124,74 +123,73 @@ pfUI:RegisterModule("socialmod", function () do -- add colors to who list hooksecurefunc("WhoList_Update", function() - local num, max = GetNumWhoResults() + local num, max = C_FriendList.GetNumWhoResults() local off = FauxScrollFrame_GetOffset(WhoListScrollFrame) local playerzone = GetRealZoneText() local playerrace = UnitRace("player") local playerguild = GetGuildInfo("player") + if num + 1 >= MAX_WHOS_FROM_SERVER then + WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), max).." |cffaaaaaa"..format(WHO_FRAME_SHOWN_TEMPLATE, MAX_WHOS_FROM_SERVER)) + else + WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), num).." |cffaaaaaa"..format(WHO_FRAME_SHOWN_TEMPLATE, num)) + end + for i=1, WHOS_TO_DISPLAY do - local name, guild, level, race, class, zone = GetWhoInfo(off + i) - local displayedText = "" + local info = C_FriendList.GetWhoInfo(off + i) + if info then + -- filename is the class token, so no L["class"] reversal is needed + local class = info.filename - if num + 1 >= MAX_WHOS_FROM_SERVER then - displayedText = format(WHO_FRAME_SHOWN_TEMPLATE, MAX_WHOS_FROM_SERVER) - WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), max).." |cffaaaaaa"..displayedText) - else - displayedText = format(WHO_FRAME_SHOWN_TEMPLATE, num) - WhoFrameTotals:SetText("|cffffffff" .. format(GetText("WHO_FRAME_TOTAL_TEMPLATE", nil, num), num).." |cffaaaaaa"..displayedText) - end + _G["WhoFrameButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b) - class = L["class"][class] - - _G["WhoFrameButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b) - - if (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 1) then - if (zone == playerzone) then - _G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1) - else - _G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1) - end - - elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 2) then - if (guild == playerguild) then - _G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1) - else - _G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1) - end - - elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 3) then - if (race == playerrace) then - _G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1) - else - _G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1) - end - end - - if class then - local classicon = _G["WhoFrameButton"..i].classicon - local coords = CLASS_ICON_TCOORDS[class] - local color = PFUI_CLASS_COLORS[class] - - -- do we have classicons? (skin enabled?) - if classicon then - _G["WhoFrameButton"..i.."Class"]:SetTextColor(0,0,0,0) - _G["WhoFrameButton"..i.."Name"]:SetTextColor(color.r,color.g,color.b,1) - - if coords then - classicon:Show() - classicon:SetTexCoord(unpack(coords)) + if (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 1) then + if (info.area == playerzone) then + _G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1) else - classicon:Hide() + _G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1) end - else - _G["WhoFrameButton"..i.."Class"]:SetTextColor(color.r,color.g,color.b,1) - end - end - local color = GetDifficultyColor(level) - _G["WhoFrameButton"..i.."Level"]:SetTextColor(color.r, color.g, color.b) + elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 2) then + if (info.fullGuildName == playerguild) then + _G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1) + else + _G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1) + end + + elseif (UIDropDownMenu_GetSelectedID(WhoFrameDropDown) == 3) then + if (info.raceStr == playerrace) then + _G["WhoFrameButton"..i.."Variable"]:SetTextColor(.5, 1, 1) + else + _G["WhoFrameButton"..i.."Variable"]:SetTextColor(1, 1, 1) + end + end + + if class then + local classicon = _G["WhoFrameButton"..i].classicon + local coords = CLASS_ICON_TCOORDS[class] + local color = PFUI_CLASS_COLORS[class] + + -- do we have classicons? (skin enabled?) + if classicon then + _G["WhoFrameButton"..i.."Class"]:SetTextColor(0,0,0,0) + _G["WhoFrameButton"..i.."Name"]:SetTextColor(color.r,color.g,color.b,1) + + if coords then + classicon:Show() + classicon:SetTexCoord(unpack(coords)) + else + classicon:Hide() + end + else + _G["WhoFrameButton"..i.."Class"]:SetTextColor(color.r,color.g,color.b,1) + end + end + + local color = GetDifficultyColor(info.level) + _G["WhoFrameButton"..i.."Level"]:SetTextColor(color.r, color.g, color.b) + end end end) end