You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

794 lines
32 KiB

-- module independent variables --
----------------------------------
local addon, ns = ...
local C, L, I = ns.LC.color, ns.L, ns.I
-- module own local variables and local cached functions --
-----------------------------------------------------------
local name = "Friends"; -- FRIENDS L["ModDesc-Friends"]
local ttName,ttName2,ttColumns,tt,tt2,module = name.."TT",name.."TT2",8;
local unknownGameError = false;
local DSw, DSh = 0, 0;
local ULx, ULy = 0, 0;
local LLx, LLy = 32, 32;
local URx, URy = 5, 27;
local LRx, LRy = 5, 27;
local off, on = strtrim(gsub(ERR_FRIEND_OFFLINE_S,"%%s","")), strtrim(gsub(ERR_FRIEND_ONLINE_SS,"\124Hplayer:%%s\124h%[%%s%]\124h",""));
local gameIconPos = setmetatable({},{ __index = function(t,k) return format("%s:%s:%s:%s:%s:%s:%s:%s:%s:%s",DSw,DSh,ULx,ULy,LLx,LLy,URx,URy,LRx,LRy) end})
--local _BNet_GetClientTexture = BNet_GetClientTexture
-- missing some entries on DF beta version of FrameXML\BNet.lua
local BNET_CLIENT_WOW = BNET_CLIENT_WOW or "WoW";
local BNET_CLIENT_SC2 = BNET_CLIENT_SC2 or "S2";
local BNET_CLIENT_D3 = BNET_CLIENT_D3 or "D3";
local BNET_CLIENT_D4 = BNET_CLIENT_D4 or "Fen";
local BNET_CLIENT_WTCG = BNET_CLIENT_WTCG or "WTCG";
local BNET_CLIENT_APP = BNET_CLIENT_APP or "App";
local BNET_CLIENT_HEROES = BNET_CLIENT_HEROES or "Hero";
local BNET_CLIENT_OVERWATCH = BNET_CLIENT_OVERWATCH or "Pro";
local BNET_CLIENT_CLNT = BNET_CLIENT_CLNT or "CLNT";
local BNET_CLIENT_SC = BNET_CLIENT_SC or "S1";
local BNET_CLIENT_DESTINY2 = BNET_CLIENT_DESTINY2 or "DST2";
local BNET_CLIENT_COD = BNET_CLIENT_COD or "VIPR";
local BNET_CLIENT_COD_MW = BNET_CLIENT_COD_MW or "ODIN";
local BNET_CLIENT_COD_MW2 = BNET_CLIENT_COD_MW2 or "LAZR";
local BNET_CLIENT_COD_BOCW = BNET_CLIENT_COD_BOCW or "ZEUS";
local BNET_CLIENT_WC3 = BNET_CLIENT_WC3 or "W3";
local BNET_CLIENT_ARCADE = BNET_CLIENT_ARCADE or "RTRO";
local BNET_CLIENT_CRASH4 = BNET_CLIENT_CRASH4 or "WLBY";
local BNET_CLIENT_D2 = BNET_CLIENT_D2 or "OSI";
local BNET_CLIENT_COD_VANGUARD = BNET_CLIENT_COD_VANGUARD or "FORE";
local BNET_CLIENT_DI = BNET_CLIENT_DI or "ANBS";
local BNET_CLIENT_ARCLIGHT = BNET_CLIENT_ARCLIGHT or "GRY";
local function _BNet_GetClientTexture(client)
if ( client == BNET_CLIENT_WOW ) then
return "Interface\\FriendsFrame\\Battlenet-WoWicon";
elseif ( client == BNET_CLIENT_SC2 ) then
return "Interface\\FriendsFrame\\Battlenet-Sc2icon";
elseif ( client == BNET_CLIENT_D3 ) then
return "Interface\\FriendsFrame\\Battlenet-D3icon";
elseif ( client == BNET_CLIENT_D4 ) then
--return "Interface\\FriendsFrame\\Battlenet-D4icon"; -- missing icon in client data
return "Interface\\AddOns\\Broker_Everything\\media\\Battlenet-D4icon.tga";
elseif ( client == BNET_CLIENT_WTCG ) then
return "Interface\\FriendsFrame\\Battlenet-WTCGicon";
elseif ( client == BNET_CLIENT_HEROES ) then
return "Interface\\FriendsFrame\\Battlenet-HotSicon";
elseif ( client == BNET_CLIENT_OVERWATCH ) then
return "Interface\\FriendsFrame\\Battlenet-Overwatchicon";
elseif ( client == BNET_CLIENT_SC ) then
return "Interface\\FriendsFrame\\Battlenet-SCicon";
elseif ( client == BNET_CLIENT_DESTINY2 ) then
return "Interface\\FriendsFrame\\Battlenet-Destiny2icon";
elseif ( client == BNET_CLIENT_COD ) then
return "Interface\\FriendsFrame\\Battlenet-CallOfDutyBlackOps4icon";
elseif ( client == BNET_CLIENT_COD_MW ) then
return "Interface\\FriendsFrame\\Battlenet-CallOfDutyMWicon";
elseif ( client == BNET_CLIENT_COD_MW2 ) then
return "Interface\\FriendsFrame\\Battlenet-CallOfDutyMW2icon";
elseif ( client == BNET_CLIENT_COD_BOCW ) then
return "Interface\\FriendsFrame\\Battlenet-CallOfDutyBlackOpsColdWaricon";
elseif ( client == BNET_CLIENT_WC3 ) then
return "Interface\\FriendsFrame\\Battlenet-Warcraft3Reforged";
elseif ( client == BNET_CLIENT_ARCADE ) then
return "Interface\\FriendsFrame\\Battlenet-BlizzardArcadeCollectionicon";
elseif ( client == BNET_CLIENT_CRASH4 ) then
return "Interface\\FriendsFrame\\Battlenet-CrashBandicoot4icon";
elseif ( client == BNET_CLIENT_D2 ) then
return "Interface\\FriendsFrame\\Battlenet-DiabloIIResurrectedicon";
elseif ( client == BNET_CLIENT_COD_VANGUARD ) then
return "Interface\\FriendsFrame\\Battlenet-CallOfDutyVanguardicon";
elseif ( client == BNET_CLIENT_DI) then
return "Interface\\FriendsFrame\\Battlenet-DiabloImmortalicon";
elseif ( client == BNET_CLIENT_ARCLIGHT) then
return "Interface\\FriendsFrame\\Battlenet-WarcraftArclightRumbleicon";
else
return "Interface\\FriendsFrame\\Battlenet-Battleneticon";
end
end
-- /missing
local gameShortcut = setmetatable({
[BNET_CLIENT_WTCG] = "HS",
[BNET_CLIENT_OVERWATCH] = "OW",
[BNET_CLIENT_HEROES] = "HotS",
[BNET_CLIENT_DI] = "ANBS",
["BSAp"] = "Mobile",
["Fen"] = "D4",
},{ __index = function(t, k) return k end });
local gameNames = setmetatable({
[BNET_CLIENT_APP]="Desktop App",
["BSAp"] = "Mobile App",
[BNET_CLIENT_D3]="Diablo 3",
[BNET_CLIENT_D4]="Diablo 4",
[BNET_CLIENT_DESTINY2]="Destiny 2",
[BNET_CLIENT_HEROES]="Heroes of the Storm",
[BNET_CLIENT_OVERWATCH]="Overwatch",
[BNET_CLIENT_SC2]="Starcraft 2",
[BNET_CLIENT_WOW]="World of Warcraft",
[BNET_CLIENT_WTCG]="Hearthstone",
[BNET_CLIENT_DI]="Warcraft Arclight Rumble",
},{ __index = function(t, k) return k end });
-- register icon names and default files --
-------------------------------------------
I[name] = {iconfile="Interface\\Addons\\"..addon.."\\media\\friends"}; --IconName::Friends--
-- some local functions --
--------------------------
local function BNet_GetClientTexture(game,tt2)
if ns.profile[name].showGame=="2" and not tt2 then
return gameShortcut[game]
else
local icon = _BNet_GetClientTexture(game)
return format("|T%s:%s|t",icon,gameIconPos[game])
end
return "";
end
local function _status(afk,dnd)
if ns.profile[name].showStatus=="1" then
return ("|T%s:0|t"):format(_G["FRIENDS_TEXTURE_" .. ((afk==true and "AFK") or (dnd==true and "DND") or "ONLINE")]);
elseif ns.profile[name].showStatus=="2" then
return (afk==true and C("gold","[AFK]")) or (dnd==true and C("ltred","[DND]")) or "";
end
return "";
end
local function updateBroker()
local dataobj = ns.LDB:GetDataObjectByName(module.ldbName);
local numBNFriends, numOnlineBNFriends = 0,0;
if BNConnected() then
numBNFriends, numOnlineBNFriends = BNGetNumFriends();
end
local numFriends = C_FriendList.GetNumFriends();
local friendsOnline = C_FriendList.GetNumOnlineFriends();
if not (tonumber(numOnlineBNFriends) and tonumber(friendsOnline)) then return end
if ns.profile[name].splitFriendsBroker then
local friends = tostring(friendsOnline);
local bnfriends = tostring(numOnlineBNFriends);
if ns.profile[name].showTotalCount then
friends = friends.."/"..numFriends;
bnfriends = bnfriends.."/"..numBNFriends;
end
dataobj.text = friends .." ".. C(BNConnected() and "ltblue" or "red",bnfriends);
else
local txt = tostring(numOnlineBNFriends + friendsOnline);
if ns.profile[name].showTotalCount then
txt = txt .."/".. (numBNFriends + numFriends);
end
dataobj.text = txt .. (BNConnected()==false and "("..C("red","BNet Off")..")" or "");
end
local broadcastText = select(4,BNGetInfo());
if (broadcastText) and (strlen(broadcastText)>0) then
dataobj.text=dataobj.text.." |Tinterface\\chatframe\\ui-chatinput-focusicon:0|t";
end
end
local function createTooltip2(self,data)
if not (ns.profile[name].showBroadcastTT2 or ns.profile[name].showBattleTagTT2 or ns.profile[name].showRealIDTT2 or ns.profile[name].showZoneTT2 or ns.profile[name].showGameTT2 or ns.profile[name].showNotesTT2) then return end
local color1 = "ltblue";
tt2 = ns.acquireTooltip(
{ttName2, 3, "LEFT","RIGHT","RIGHT"},
{true,true},
{self, "horizontal", tt}
);
if tt2.lines~=nil then tt2:Clear(); end
local l=tt2:AddHeader(C("dkyellow",NAME));
tt2:SetCell(l,2,C(data.className or color1,ns.scm(data.name)),nil,nil,0);
tt2:AddSeparator();
-- game
if ns.profile[name].showGameTT2 then
tt2:SetCell(tt2:AddLine(C(color1,data.client=="App" and L["Program"] or GAME)),2,gameNames[data.client] .." ".. BNet_GetClientTexture(data.client,true),nil,"RIGHT",0);
end
if data.client==BNET_CLIENT_WOW then
-- realm
if (data.realm) then
tt2:SetCell(tt2:AddLine(C(color1,L["Realm"])),2,ns.scm(data.realm),nil,"RIGHT",0);
end
-- faction
if ns.profile[name].showFactionTT2 then
tt2:SetCell(tt2:AddLine(C(color1,FACTION)),2, data.factionL .. " |TInterface\\PVPFrame\\PVP-Currency-".. data.factionT ..":14:14:0:-1:32:32:3:29:3:29|t", nil,"RIGHT",0);
end
end
-- zone
if ns.profile[name].showZoneTT2 and data.area then
tt2:SetCell(tt2:AddLine(C(color1,ZONE)),2,data.area,nil,"RIGHT",0);
end
-- notes
if ns.profile[name].showNotesTT2 and data.notes and data.notes:trim():len()>0 then
tt2:AddSeparator(4,0,0,0,0);
tt2:SetCell(tt2:AddLine(),1,C(color1,COMMUNITIES_ROSTER_COLUMN_TITLE_NOTE),nil,nil,0);
tt2:AddSeparator();
tt2:SetCell(tt2:AddLine(),1,ns.scm(data.notes,true),nil,"LEFT",0);
end
-- broadcast
if ns.profile[name].showBroadcastTT2 and data.broadcast and data.broadcast:len()>0 then
tt2:AddSeparator(4,0,0,0,0);
tt2:SetCell(tt2:AddLine(),1,C(color1,BATTLENET_BROADCAST),nil,nil,0);
tt2:AddSeparator();
local broadcast = data.broadcast;
if ns.profile.GeneralOptions.scm then
broadcast="***"; -- dummy text
else
broadcast=ns.strWrap(broadcast,48);
end
tt2:SetCell(tt2:AddLine(),1,broadcast,nil,"LEFT",0);
if data.broadcastTime then
tt2:SetCell(tt2:AddLine(),1,C("ltgray","("..L["Active since"]..CHAT_HEADER_SUFFIX..SecondsToTime(time()-data.broadcastTime)..")"),nil,"RIGHT",0);
end
end
ns.roundupTooltip(tt2);
end
local function tooltipLineScript_OnMouseUp(self,data,button)
if data.type=="realm" then
-- whisper toon to toon
if IsAltKeyDown() then
if C_PartyInfo.InviteUnit then
C_PartyInfo.InviteUnit(data.fullName);
elseif InviteUnit then
InviteUnit(data.fullName);
end
else
ChatFrame_SendTell(data.fullName:gsub(" ",""));
end
elseif data.type=="battlenet" then
-- battlenet whisper
if IsAltKeyDown() then
if data.client=="WoW" then
BNInviteFriend(data.toonID);
end
else
local func,name = "BNet",data.account; -- account name
if button=="RightButton" then
func,name = "",data.name; -- toon name
if ns.realm~=data.realm then
name = name .."-".. ns.stripRealm(data.realm);
end
end
securecall("ChatFrame_Send"..func.."Tell",name);
end
end
end
local C_BattleNet_GetFriendNumGameAccounts = (C_BattleNet and C_BattleNet.GetFriendNumGameAccounts) or BNGetNumFriendGameAccounts;
local C_BattleNet_GetFriendGameAccountInfo = (C_BattleNet and C_BattleNet.GetFriendGameAccountInfo) or function(friendIndex, accountIndex)
local gameAccountInfo,_ = {};
gameAccountInfo.hasFocus, -- 1
gameAccountInfo.characterName, -- 2
gameAccountInfo.clientProgram, -- 3
gameAccountInfo.realmName, -- 4
gameAccountInfo.realmID, -- 5
gameAccountInfo.factionName, -- 6
gameAccountInfo.raceName, -- 7
gameAccountInfo.className, -- 8
_, -- 9
gameAccountInfo.areaName, -- 10
gameAccountInfo.characterLevel, -- 11
gameAccountInfo.richPresence, -- 12
_, --accountInfo.customMessage, -- 13
_, --accountInfo.customMessageTime, -- 14
gameAccountInfo.isOnline, -- 15
gameAccountInfo.gameAccountID, -- 16
_, --accountInfo.bnetAccountID, -- 17
gameAccountInfo.isGameAFK, -- 18
gameAccountInfo.isGameBusy, -- 19
gameAccountInfo.playerGuid, -- 20
gameAccountInfo.wowProjectID, -- 21
gameAccountInfo.isWowMobile -- 22
= BNGetFriendGameAccountInfo(friendIndex, accountIndex)
return gameAccountInfo
end
local function createTooltip(tt)
if not (tt and tt.key and tt.key==ttName) then return end -- don't override other LibQTip tooltips...
local columns,l,c=8;
local numFriends = C_FriendList.GetNumFriends();
local friendsOnline = C_FriendList.GetNumOnlineFriends();
local numBNFriends, numOnlineBNFriends = BNGetNumFriends();
if tt.lines~=nil then tt:Clear(); end
tt:SetCell(tt:AddLine(),1,C("dkyellow",L[name]),tt:GetHeaderFont(),"LEFT",0);
local _, _, _, broadcastText = BNGetInfo();
if broadcastText~=nil and broadcastText~="" then
tt:AddSeparator(4,0,0,0,0);
tt:SetCell(tt:AddLine(),1,C("dkyellow",L["My current broadcast message"]),nil,nil,columns);
tt:AddSeparator();
tt:SetCell(tt:AddLine(),1,C("white",ns.scm(broadcastText,true)),nil,nil,columns);
end
local fi,nt,ti;
local visible = {};
tt:AddSeparator(4,0,0,0,0);
tt:AddLine(
C("ltyellow",L["Real ID"].."/"..BATTLETAG), -- 1
C("ltyellow",LEVEL), -- 2
C("ltyellow",CHARACTER), -- 3
ns.profile[name].showGame~="0" and C("ltyellow",GAME) or "", -- 4
ns.profile[name].showZone and C("ltyellow",ZONE) or "", -- 5
ns.profile[name].showRealm=="1" and C("ltyellow",L["Realm"]) or "", -- 6
ns.profile[name].showFaction=="2" and C("ltyellow",FACTION) or "", -- 7
ns.profile[name].showNotes and C("ltyellow",L["Notes"]) or "" -- 8
);
tt:AddSeparator();
if ns.profile[name].showBNFriends then
tt:SetCell(tt:AddLine(),1,C("ltgray",L["BattleNet friends"]),nil,"LEFT",0);
local friendsDisplayed = false;
if not BNConnected() then
tt:SetCell(tt:AddLine(),1," "..C("ltred",BATTLENET_UNAVAILABLE),nil,"LEFT",0);
else
-- RealId Status Character Level Zone Game Realm Notes
for i=1, numBNFriends do
local nt = C_BattleNet_GetFriendNumGameAccounts(i);
local fi = ns.C_BattleNet_GetFriendAccountInfo(i);
if nt and fi and fi.gameAccountInfo.isOnline then
for I=1, nt do
local ti = C_BattleNet_GetFriendGameAccountInfo(i,I) or {};
local bcIcon = fi.customMessage~="" and "|Tinterface\\chatframe\\ui-chatinput-focusicon:0|t" or "";
local cl = ti.clientProgram;
local mobileApp = cl~="BSAp" or (cl=="BSAp" and ns.profile[name].showMobileApp); -- filter mobile app
local desktopApp = cl~= "App" or (cl== "App" and ns.profile[name].showDesktopApp); -- filter desktop app
local duplicates = not visible[fi.bnetAccountID]; -- filter duplicates...
if duplicates and mobileApp and desktopApp then
local isBNColor=false;
visible[fi.bnetAccountID] = true
local l = tt:AddLine();
-- wow logout is buggy. sometimes level==0 and reamid==0. player is logout out but displayed as playing wow
if ti.characterLevel==0 and ti.realmID==0 then
ti.clientProgram = "App"
end
-- wow clients compare
if ti.clientProgram=="WoW" then
ti.realmInfo = {};
local areaName,realmName,_ = ti.richPresence:match("^(.*) %- (.*)$");
_, ti.realmInfo.Name, _, _, ti.realmInfo.Locale, _, ti.realmInfo.Region, ti.realmInfo.Timezone = ns.LRI:GetRealmInfoByID(ti.realmID);
if not ti.realmInfo.Name and realmName then
-- get missing realmInfo via realmName from richPresence
_, ti.realmInfo.Name, _, _, ti.realmInfo.Locale, _, ti.realmInfo.Region, ti.realmInfo.Timezone = ns.LRI:GetRealmInfo(realmName,ns.region);
end
if not (ti.realmName and ti.realmName~="") then
if ti.realmInfo.Name then
-- get realmName from realmInfo
ti.realmName = ti.realmInfo.Name;
elseif realmName then
-- get realmName from richPresence
ti.realmName = realmName;
end
end
-- show different project id
if WOW_PROJECT_ID ~= ti.wowProjectID then
-- add project name to realmName
ti.realmName = ti.realmName .. " |cffffee00("..L["WoWProjectId"..ti.wowProjectID]..")|r";
-- replace areaName
ti.areaName = areaName;
end
end
-- battle tags / realids
if ns.profile[name].showBattleTags~="0" then
local a,b = strsplit("#",fi.battleTag);
local BattleTag = C("ltblue",ns.scm(a))..C("ltgray","#"..ns.scm(b));
local bnName=C("ltblue",ns.scm(fi.accountName));
-- 0 Disabled
-- 1 Name
-- 2 Name (BattleTag)
-- 3 BattleTag
if ns.profile[name].showBattleTags=="2" then
bnName = bnName .. C("white"," (")..BattleTag..C("white",")");
elseif ns.profile[name].showBattleTags=="3" then
bnName = BattleTag;
end
tt:SetCell(l,1," "..bnName..bcIcon); -- 1
end
-- level
ti.characterLevel = tonumber(ti.characterLevel);
if ti.characterLevel and ti.characterLevel>0 then
tt:SetCell(l,2,C("white",ti.characterLevel)); -- 2
end
-- toon name
local nameStr = (ti.characterName and ti.characterName~="" and ti.characterName) or (fi.isBattleTagFriend and fi.accountName and fi.accountName~="" and fi.accountName) or strsplit("#",fi.battleTag);
if ti.clientProgram=="WoW" and ti.realmID>0 and ti.className then
nameStr = C(ti.className,ns.scm(nameStr)); -- wow character name in class color
else
nameStr = C("ltblue",ns.scm(nameStr)); -- all other in light blue
end
-- toon name - append realm name or asterisk
if tonumber(ns.profile[name].showRealm)>1 and ti.realmName~=ns.realm_short and ti.realmID and ti.realmID>0 then
if ns.profile[name].showRealm=="2" then
nameStr = nameStr..C("dkyellow","-"..ns.scm(ti.realmName));
else
nameStr = nameStr..C("dkyellow","*");
end
end
-- toon name - append faction icon
if ns.profile[name].showFaction=="1" and ti.clientProgram=="WoW" and ti.factionName then
nameStr = nameStr.."|TInterface\\PVPFrame\\PVP-Currency-"..ti.factionName..":16:16:0:-1:32:32:2:30:2:30|t";
elseif ns.profile[name].showBattleTags=="0" and ti.clientProgram~="App" then
nameStr = nameStr.." "..bcIcon;
end
tt:SetCell(l,3,_status(fi.isAFK,fi.isDND)..nameStr); -- 3
-- game icon or text
if ns.profile[name].showGame~="0" then
tt:SetCell(l,4,C("white", BNet_GetClientTexture(ti.clientProgram) )); -- 4
end
-- zone or current screen
if ns.profile[name].showZone then
if ti.clientProgram=="WoW" and ti.areaName and ti.areaName:match("^"..GARRISON_LOCATION_TOOLTIP) and ti.areaName~=GARRISON_LOCATION_TOOLTIP then
ti.areaName = GARRISON_LOCATION_TOOLTIP;
end
local zoneStr = (ti.areaName and ti.areaName~="" and ti.areaName) or --[[(ti.richPresence and ti.richPresence~="" and ti.richPresence) or]] (ti.clientProgram and ti.clientProgram~="" and gameNames[ti.clientProgram]) or UNKNOWN;
tt:SetCell(l,5,C("white",zoneStr),nil,nil, ti.clientProgram=="WoW" and 1 or 3); -- 5,6,7
end
if ti.clientProgram=="WoW" then
-- realm (own column)
if ns.profile[name].showRealm=="1" and ti.realmID>0 then
local realmLocaleIcon = ""
if ns.profile[name].showRealmLanguageFlag and ti.realmInfo.Locale then
if ti.realmInfo.Region=="EU" and ti.realmInfo.Locale=="enUS" then
ti.realmInfo.Locale = "enGB"; -- Great Britain
elseif ti.realmInfo.Region=="US" and ti.realmInfo.Timezone=="AEST" then
ti.realmInfo.Locale = "enAU"; -- flag of australian
end
realmLocaleIcon = "|T"..ns.media .. "countries/" .. ti.realmInfo.Locale .. ":0:2|t";
end
if not ti.realmName then
ti.realmName = (ti.realmID and "Unknown Realm [Id: "..ti.realmID.."]" or UNKNOWN) --.." |cffffee00("..EXPANSION_NAME0.."?)|r";
end
tt:SetCell(l,6,C( (ns.realms[ti.realmName] or (ti.realmName and ns.realms[ti.realmName])) and "green" or "white",ti.realmName .. realmLocaleIcon)); -- 6
end
-- faction (own column)
if ti.factionName then
if ns.profile[name].showFaction=="2" then
local color = "green";
if ti.factionName=="Alliance" then
color = "ff0077ff"
elseif ti.factionName=="Horde" then
color = "red"
end
tt:SetCell(l,7,C(color,_G["FACTION_"..ti.factionName:upper()] or ti.factionName)); -- 7
elseif ns.profile[name].showFaction=="3" then
if ti.factionName=="Neutral" then
tt:SetCell(l,7,"|TInterface\\minimap\\tracking\\battlemaster:16:16:0:-1:32:32:2:30:2:30|t");
else
tt:SetCell(l,7,"|TInterface\\PVPFrame\\PVP-Currency-"..ti.factionName..":16:16:0:-1:32:32:2:30:2:30|t");
end
end
end
end
-- notes
if ns.profile[name].showNotes and fi.note then
tt:SetCell(l,8,C("white",C("white",ns.scm(fi.note,true)))); -- 8
end
local data = {
type = "battlenet",
toonID = ti.gameAccountID,
account = fi.accountName,
className = ti.className or false,
name = ti.characterName,
client = ti.clientProgram,
realm = ti.realmName,
area = ti.clientProgram~="App" and (ti.areaName or ti.richPresence) or false,
notes = strtrim(fi.note or ""),
broadcast = strtrim(fi.customMessage or ""),
broadcastTime = fi.customMessageTime or false,
};
if ti.factionName then
data.factionT = ti.factionName:upper();
data.factionL = _G["FACTION_"..ti.factionName:upper()];
end
tt:SetLineScript(l, "OnMouseUp", tooltipLineScript_OnMouseUp, data);
tt:SetLineScript(l, "OnEnter", createTooltip2, data);
friendsDisplayed = true;
end
end
end
end
end
if not friendsDisplayed then
tt:SetCell(tt:AddLine(),1," "..C("gray",L["Currently no battle.net friends online..."]),nil,"LEFT",0);
end
end
if ns.profile[name].showFriends then
tt:SetCell(tt:AddLine(),1,C("ltgray",FRIENDS),nil,"LEFT",0);
if friendsOnline==0 then
tt:SetCell(tt:AddLine(),1," "..C("gray",L["Currently no friends online..."]),nil,"LEFT",0);
else
local charName,level,class,area,connected,status,note,cName,cRealm,cGame=1,2,3,4,5,6,7,18,19,20; -- GetFriendInfo
local l,c,s,n,_;
for i=1, numFriends do
local v = C_FriendList.GetFriendInfoByIndex(i);
v.fullName = v.name;
if v.name:find("-") then
v.name, v.realm = strsplit("-",v.fullName,2);
else
v.realm = ns.realm;
v.fullName = v.fullName .."-".. ns.realm;
end
v.client = BNET_CLIENT_WOW;
if visible[v.name..v.realm..v.area] then
-- filter duplicates...
elseif v.name and v.connected then
visible[v.name..v.realm..v.area] = true;
local l = tt:AddLine("","","","","","","","");
tt:SetCell(l,2,C("white",v.level));
local nameStr = _status(v.afk,v.dnd) .. C(v.className:upper(),ns.scm(v.name));
local realm,_
if type(v.realm)=="string" and v.realm:len()>0 then
_,realm = ns.LRI:GetRealmInfo(v.realm,ns.region);
end
if tonumber(ns.profile[name].showRealm)>1 and v.realm~=ns.realm then
if ns.profile[name].showRealm=="2" then
nameStr = nameStr..C("dkyellow","-"..ns.scm(realm or v.realm));
else
nameStr = nameStr..C("dkyellow","*");
end
end
if ns.profile[name].showFaction=="1" then
nameStr = nameStr.."|TInterface\\PVPFrame\\PVP-Currency-"..ns.player.faction..":16:16:0:-1:32:32:2:30:2:30|t";
end
tt:SetCell(l,3,nameStr);
-- client icon or text
if ns.profile[name].showGame~="0" then
tt:SetCell(l,4,C("white",BNet_GetClientTexture(v.client)));
end
-- zone
if ns.profile[name].showZone then
if v.area:match("^"..GARRISON_LOCATION_TOOLTIP) and v.area~=GARRISON_LOCATION_TOOLTIP then
v.area = GARRISON_LOCATION_TOOLTIP;
end
tt:SetCell(l,5,C("white",v.area));
end
-- realm
if ns.profile[name].showRealm=="1" then
tt:SetCell(l,6,C("green",realm or v.realm));
end
-- faction
if ns.profile[name].showFaction=="2" then
tt:SetCell(l,7,C(ns.player.faction=="Horde" and "red" or "ltblue",ns.player.factionL or ns.player.faction));
elseif ns.profile[name].showFaction=="3" then
tt:SetCell(l,7,"|TInterface\\PVPFrame\\PVP-Currency-"..ns.player.faction..":16:16:0:-1:32:32:2:30:2:30|t");
end
-- notes
if ns.profile[name].showNotes then
tt:SetCell(l,8,C("white",ns.scm(v[note] or "")));
end
v.type = "realm";
v.factionT = ns.player.faction:upper();
v.factionL = ns.player.factionL;
tt:SetLineScript(l, "OnMouseUp", tooltipLineScript_OnMouseUp, v);
tt:SetLineScript(l, "OnEnter", createTooltip2, v);
end
end
end
end
if not ns.profile[name].showBNFriends and not ns.profile[name].showFriends then
tt:AddLine(C("ltgray",L["No friends to diplay. You have both disabled for tooltip"]));
end
if (ns.profile.GeneralOptions.showHints) then
tt:AddSeparator(3,0,0,0,0);
tt:SetCell(tt:AddLine(),1,C("ltblue",L["MouseBtn"]).." || "..C("green",WHISPER) .." - ".. C("ltblue",L["ModKeyA"].."+"..L["MouseBtn"]).." || "..C("green",TRAVEL_PASS_INVITE),nil,nil,columns);
ns.ClickOpts.ttAddHints(tt,name,nil,2);
end
ns.roundupTooltip(tt);
end
-- module functions and variables --
------------------------------------
module = {
events = {
"BATTLETAG_INVITE_SHOW", -- ?
"BN_BLOCK_LIST_UPDATED",
"BN_CONNECTED",
"BN_CUSTOM_MESSAGE_CHANGED",
"BN_CUSTOM_MESSAGE_LOADED",
"BN_DISCONNECTED",
"BN_FRIEND_ACCOUNT_OFFLINE",
"BN_FRIEND_ACCOUNT_ONLINE",
"BN_FRIEND_INFO_CHANGED",
"BN_FRIEND_INVITE_ADDED",
"BN_FRIEND_INVITE_REMOVED",
"BN_INFO_CHANGED",
"FRIENDLIST_UPDATE",
"PLAYER_LOGIN",
"CHAT_MSG_SYSTEM"
},
config_defaults = {
enabled = true,
-- broker button
splitFriendsBroker = true,
showFriendsBroker = true,
showBNFriendsBroker = true,
-- tooltip 1
showFriends = true,
showStatus = "1",
showBNFriends = true,
showBattleTags = "3",
showRealm = "1",
showGame = "1",
showFaction = "2",
showZone = true,
showNotes = true,
showTotalCount = true,
showMobileApp = true,
showDesktopApp = true,
showRealmLanguageFlag = true,
-- tooltip 2
showBroadcastTT2 = true,
showBattleTagTT2 = false,
showRealIDTT2 = false,
showFactionTT2 = false,
showZoneTT2 = false,
showGameTT2 = false,
showNotesTT2 = false
},
clickOptionsRename = {
["friends"] = "1_open_character_info",
["menu"] = "2_open_menu"
},
clickOptions = {
["friends"] = {SOCIAL_BUTTON,"call",{"ToggleFriendsFrame",1}},
["menu"] = "OptionMenu"
}
}
ns.ClickOpts.addDefaults(module,{
friends = "_LEFT",
menu = "_RIGHT"
});
function module.options()
return {
broker = {
splitFriendsBroker={ type="toggle", order=1, name=L["Split friends on Broker"], desc=L["Split Characters and BattleNet-Friends on Broker Button"] },
showFriendsBroker={ type="toggle", order=2, name=L["Show friends"], desc=L["Display count of friends if 'Split friends on Broker' enabled otherwise add friends to summary count."]},
showBNFriendsBroker={ type="toggle", order=3, name=L["Show BattleNet friends"], desc=L["Display count of BattleNet friends on Broker if 'Split friends on Broker' enabled otherwise add BattleNet friends to summary count."] },
showTotalCount={ type="toggle", order=4, name=L["Show total count"], desc=L["Display total count of friens and/or BattleNet friends on broker button"] },
},
tooltip1 = {
name = L["Main tooltip options"],
order = 2,
showFriends={ type="toggle", order=1, name=L["Show friends"], desc=L["Display friends in tooltip"] },
showBNFriends={ type="toggle", order=2, name=L["Show BattleNet friends"], desc=L["Display BattleNet friends in tooltip"] },
showBattleTags={ type="select", order=3, name=L["Show BattleTag/RealID"], desc=L["Display BattleTag and/or RealID in tooltip"], width="double",
values={
["0"] = NONE.." / "..ADDON_DISABLED,
["1"] = "RealID or BattleName",
["2"] = "RealID or BattleName (BattleTag)",
["3"] = "BattleTag",
},
},
showRealm={ type="select", order=4, name=L["Show realm"], desc=L["Display realm name in tooltip (WoW only)"], width="double",
values={
["0"] = NONE.." / "..ADDON_DISABLED,
["1"] = L["Realm name in own column"],
["2"] = L["Realm name in character name column"],
["3"] = L["* (Asterisk) behind character name if on foreign realm"]
},
},
showRealmLanguageFlag = { type="toggle", order=4, name=L["Show country flag"], desc = L["Display country flag behind realm names"] },
showFaction={ type="select", order=5, name=L["Show faction"], desc=L["Display faction in tooltip (WoW only)"], width="double",
values={
["0"]=NONE.." / "..ADDON_DISABLED,
["1"]=L["Icon behind character name"],
["2"]=L["Faction name in own column"],
["3"]=L["Faction icon in own column"]
},
},
showGame={ type="select", order=6, name=L["Show game"], desc=L["Display game icon or game shortcut in tooltip"], --width="double",
values={
["0"]=NONE.." / "..ADDON_DISABLED,
["1"]=L["Game icon"],
["2"]=L["Game shortcut"]
},
},
showStatus={ type="select", order=7, name=L["Show status"], desc=L["Display status like AFK in tooltip"], -- width="double",
values={
["0"]=NONE.." / "..ADDON_DISABLED,
["1"]=L["Status icon"],
["2"]=L["Status text"],
},
},
showZone={ type="toggle", order=8, name=ZONE, desc=L["Display zone in tooltip"] },
showNotes={ type="toggle", order=9, name=L["Notes"], desc=L["Display notes in tooltip"] },
showMobileApp={ type="toggle", order=9, name=L["Show MobileApp"], desc=L["Display Battle.Net-Friends on MobileApp in tooltip"] },
showDesktopApp={ type="toggle", order=9, name=L["Show DesktopApp"], desc=L["Display Battle.Net-Friends on DesktopApp in tooltip"] },
},
tooltip2 = {
name=L["Second tooltip options"],
order = 3,
desc={ type="description", order=11, name=L["The secondary tooltip will be displayed by moving the mouse over a friend in main tooltip. The tooltip will be displayed if one of the following options activated."], fontSize="medium"},
showBroadcastTT2={ type="toggle", order=12, name=L["Show broadcast message"], desc=L["Display broadcast message in tooltip (BattleNet friend only)"] },
showBattleTagTT2={ type="toggle", order=13, name=L["Show BattleTag"], desc=L["Display BattleTag in tooltip (BattleNet friend only)"] },
showRealIDTT2={ type="toggle", order=14, name=L["Show RealID"], desc=L["Display RealID in tooltip if available (BattleNet friend only)"] },
showFactionTT2={ type="toggle", order=15, name=L["Show faction"], desc=L["Display faction in tooltip if available"] },
showZoneTT2={ type="toggle", order=16, name=L["Show zone"], desc=L["Display zone in second tooltip"] },
showGameTT2={ type="toggle", order=17, name=L["Show game"], desc=L["Display game in second tooltip"] },
showNotesTT2={ type="toggle", order=18, name=L["Show notes"], desc=L["Display notes in second tooltip"] },
},
misc = nil,
}
end
-- function module.init() end
function module.onevent(self,event,arg1)
if event=="BE_UPDATE_CFG" and arg1 and arg1:find("^ClickOpt") then
ns.ClickOpts.update(name);
elseif event=="PLAYER_LOGIN" then
if type(ns.profile[name].showBattleTags)=="boolean" then
ns.profile[name].showBattleTags = ns.profile[name].showBattleTags and "3" or "0";
end
elseif ns.eventPlayerEnteredWorld then
updateBroker();
if (tt) and (tt.key) and (tt.key==ttName) and (tt:IsShown()) then
createTooltip(tt);
end
end
end
-- function module.optionspanel(panel) end
-- function module.onmousewheel(self,direction) end
-- function module.ontooltip(tt) end
function module.onenter(self)
if (ns.tooltipChkOnShowModifier(false)) then return; end
tt = ns.acquireTooltip(
{ttName, ttColumns, "LEFT","CENTER", "LEFT", "CENTER", "LEFT", "LEFT", "LEFT", "LEFT"},
{false},
{self}
);
createTooltip(tt);
end
-- function module.onleave(self) end
-- function module.onclick(self,button)
-- function module.ondblclick(self,button) end
-- final module registration --
-------------------------------
ns.modules[name] = module;