if (not XPerl_GetUsage) then XPerl_Usage = {} local lastSend = 0 local notifiedVersion = nil local needToSend = {} local responsePacket -- CheckForNewerVersion local function CheckForNewerVersion(ver) if (not strfind(strlower(ver), "beta")) then --local _, _, a,b,c = strfind(ver, "(%d+).(%d+).(%d+)") --local _, _, aa,bb,cc = strfind(XPerl_VersionNumber, "(%d+).(%d+).(%d+)") --local vThem = a * 10000 + b * 100 + c --local vMe = aa * 10000 + bb * 100 + cc --if (vThem > vMe) then if (ver > XPerl_VersionNumber) then if (not notifiedVersion or notifiedVersion < ver) then notifiedVersion = ver DEFAULT_CHAT_FRAME:AddMessage(XPerl_ProductName.." |c00FFFFFF"..ver.."|r is available for download") end return true end end end -- ProcessXPerlMessage local function ProcessXPerlMessage(unitName, msg) local myUsage = XPerl_Usage[unitName] if (not myUsage) then myUsage = {} XPerl_Usage[unitName] = myUsage end local rcv if (msg == "R") then -- It's a response packet, so don't reply responsePacket = true if (XPerlTest) then myUsage.responses = (myUsage.responses or 0) + 1 end elseif (strsub(msg, 1, 4) == "VER ") then -- ChatFrame7:AddMessage(" Received info from "..unitName..", channel: "..arg3) if (XPerlTest) then myUsage.packets = (myUsage.packets or 0) + 1 end local ver = strsub(msg, 5) if (ver ~= XPerl_VersionNumber) then myUsage.version = ver CheckForNewerVersion(ver) end if (not responsePacket) then rcv = true end elseif (strsub(msg, 1, 4) == "MOD ") then myUsage.mods = strsub(msg, 5) elseif (strsub(msg, 1, 4) == "LOC ") then local loc = strsub(msg, 5) if (loc ~= GetLocale()) then myUsage.locale = loc end elseif (strsub(msg, 1, 3) == "GC ") then myUsage.gc = tonumber(strsub(msg, 4)) end if (rcv) then if (unitName ~= UnitName("player")) then -- Will send out our own version when we receive one, if it's been at least 2 minutes since the last send XPerl_SendModules(arg3, true) end end end -- GuildMateTooltip local function GuildMateTooltip() if (XPerlConfig.XPerlTooltipInfo == 0) then return end local name, rank, rankIndex, level, class, zone, note, officernote, online = GetGuildRosterInfo(this.guildIndex) if (name) then local xpUsage = XPerl_Usage[name] if (xpUsage) then local ver if (xpUsage.version) then ver = xpUsage.version else ver = XPerl_VersionNumber end GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT") GameTooltip:ClearLines() if (xpUsage.locale) then GameTooltip:AddDoubleLine(XPerl_ProductName.." "..ver, xpUsage.locale, 1, 1, 1, 0.5, 0.5, 0.5) else GameTooltip:SetText(XPerl_ProductName.." "..ver, 1, 1, 1) end if (xpUsage.version and CheckForNewerVersion(xpUsage.version)) then GameTooltip:AddLine("*Newer version", 0.5, 1, 0.5) end if (xpUsage.mods) then local modList = XPerl_DecodeModuleList(xpUsage.mods) if (modList) then GameTooltip:AddLine("Modules: "..modList, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1) end end if (xpUsage.gc and IsShiftKeyDown()) then GameTooltip:AddLine("UI Mem Max: "..xpUsage.gc, 0.8, 0.2, 0.2) end GameTooltip:Show() return end end GameTooltip:Hide() end -- XPerl_UsageStartup function XPerl_Usage_OnEvent() if (event == "PLAYER_ENTERING_WORLD") then -- Hook the guild name list to show tooltip for X-Perl users for i = 1,13 do local f = getglobal("GuildFrameButton"..i) if (f) then f:SetScript("OnEnter", GuildMateTooltip) f:SetScript("OnLeave", XPerl_PlayerTipHide) end f = getglobal("GuildFrameGuildStatusButton"..i) if (f) then f:SetScript("OnEnter", GuildMateTooltip) f:SetScript("OnLeave", XPerl_PlayerTipHide) end end if (GetNumRaidMembers() > 0) then needToSend.RAID = true elseif (GetNumPartyMembers() > 0) then needToSend.PARTY = true end XPerl_SendModules("GUILD") else if (arg1 == XPERL_COMMS_PREFIX) then XPerl_ParseCTRA(arg4, arg2, ProcessXPerlMessage) responsePacket = nil elseif (arg1 == "CTRA") then XPerl_SendToChannel() -- Check's to see if anything pending to send end end end -- XPerl_SplitCTRAMessage function XPerl_SplitCTRAMessage(msg, char) local arr = { } while (strfind(msg, char) ) do local iStart, iEnd = strfind(msg, char) tinsert(arr, strsub(msg, 1, iStart-1)) msg = strsub(msg, iEnd+1, strlen(msg)) end if ( strlen(msg) > 0 ) then tinsert(arr, msg) end return arr end -- XPerl_ParseCTRA function XPerl_ParseCTRA(nick, msg, func) if (strfind(msg, "#")) then local arr = XPerl_SplitCTRAMessage(msg, "#") for i,subMsg in pairs(arr) do func(nick, subMsg) end else func(nick, msg) end end -- !!!!! Don't change the order of this list - EVER!!!!! local xpModList = {"XPerl", "XPerl_Player", "XPerl_PlayerPet", "XPerl_Target", "XPerl_TargetTarget", "XPerl_Party", "XPerl_PartyPet", "XPerl_RaidFrames", "XPerl_RaidHelper", "XPerl_RaidAdmin"} -------------------------------------------------------- -- XPerl_SendModules function XPerl_SendModules(chan, response) if (not chan) then chan = "RAID" end needToSend[chan] = true XPerl_SendToChannel(response) end -- MakePacket local function MakePacket(response) local modules = "" for k,v in pairs(xpModList) do modules = modules..(tostring(IsAddOnLoaded(v) or 0)) end local _, gc = gcinfo() local resp if (response) then resp = "R#" else resp = "" end return resp.."VER "..XPerl_VersionNumber.."#GC "..gc.."#LOC "..GetLocale().."#MOD "..modules end -- XPerl_SendToChannel function XPerl_SendToChannel(response) if (GetTime() < lastSend + 2*60) then return end lastSend = GetTime() local packet for k,v in pairs({"GUILD", "RAID", "PARTY", "BATTLEGROUND"}) do if (needToSend[v]) then if (IsInGuild() or v ~= "GUILD") then if (not packet) then packet = MakePacket(response) end SendAddonMessage(XPERL_COMMS_PREFIX, packet, v) needToSend[v] = nil end end end end -- XPerl_DecodeModuleList function XPerl_DecodeModuleList(modList) local nameList = {XPerl = "Core", XPerl_Player = "Player", XPerl_PlayerPet = "Player's Pet", XPerl_Target = "Target", XPerl_TargetTarget = "Target's Target", XPerl_Party = "Party", XPerl_PartyPet = "Party Pets", XPerl_RaidFrames = "Raid Frames", XPerl_RaidHelper = "Raid Helper", XPerl_RaidAdmin = "Raid Admin"} local ret, sep, any = "", "" for k,v in pairs(xpModList) do if (strsub(modList, k, k) == "1") then if (nameList[v]) then ret = ret..sep..nameList[v] else ret = ret..sep..v end sep = ", " any = true end end if (any) then return ret end end -- XPerl_GetUsage(unitName) function XPerl_GetUsage(unitName) return XPerl_Usage[unitName] end if (not XPerl_UsageFrame) then local f = CreateFrame("Frame", "XPerl_UsageFrame") f:RegisterEvent("PLAYER_ENTERING_WORLD") f:RegisterEvent("CHAT_MSG_ADDON") f:SetScript("OnEvent", XPerl_Usage_OnEvent) end end