-- 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_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_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", },{ __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_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;