--[[ Guild Event Manager by Kiki of European Cho'gall Players list - By Kiki ]] GEM_PLAYERS_SORTBY_NAME = "name"; GEM_PLAYERS_SORTBY_GUILD = "guild"; GEM_PLAYERS_SORTBY_LOCATION = "location"; GEM_PLAYERS_SORTBY_LEVEL = "level"; GEM_PLAYERS_SORTBY_CLASS = "class"; local GEM_PLAYERS_LASTLOG_MAX = 60*60*24*30; local GEM_PLAYERS_MAXDISPLAY_EVENT = 25; local sortTypePlayers = GEM_PLAYERS_SORTBY_NAME; local sortDirPlayers = true; local selectPlayer = nil; --[[ List Functions ]] function GEMPlayers_PlayerOnHover() local pl_name = this.playerName; if(pl_name) then GameTooltip:SetOwner(this, "ANCHOR_CURSOR"); GameTooltip:ClearLines(); local color1 = "00AAFF"; local color2 = "FFFFFF"; local color3 = "E0C010"; if(not GEM_IsPlayerConnected(GEM_DefaultSendChannel,pl_name)) then color1 = "005588"; color2 = "888888"; color3 = "706005"; end local comment = ""; local rank_idx = -1; local rank_name = ""; local version = ""; if(GEM_Players[GEM_Realm] and GEM_Players[GEM_Realm][GEM_DefaultSendChannel] and GEM_Players[GEM_Realm][GEM_DefaultSendChannel][pl_name]) then comment = GEM_Players[GEM_Realm][GEM_DefaultSendChannel][pl_name].comment; rank_name = GEM_Players[GEM_Realm][GEM_DefaultSendChannel][pl_name].grank_name; rank_idx = GEM_Players[GEM_Realm][GEM_DefaultSendChannel][pl_name].grank_idx; version = GEM_Players[GEM_Realm][GEM_DefaultSendChannel][pl_name].version; end local lines = 0; lines = GEMList_AddTooltipText("|cff" .. color1 .. pl_name,lines); if(version and version ~= "") then lines = GEMList_AddTooltipText("|cff" .. color2 .. GEM_TEXT_GEM_VERSION .. " : |r|cff" ..color3..version.."|r",lines,color3); end if(rank_name and rank_name ~= "") then lines = GEMList_AddTooltipText("|cff" .. color2 .. GEM_TEXT_GUILD_RANK .. " " .. rank_idx .. " : |r|cff" ..color3.. rank_name.."|r",lines,color3); end if(comment and comment ~= "") then lines = GEMList_AddTooltipText("|cff" .. color2 .. GEM_TEXT_COMMENT .. " : |r|cff" ..color3..comment.."|r",lines,color3); end if(lines > 1) then GameTooltip:Show(); else GameTooltip:ClearLines(); end end end function GEMPlayers_PlayerOnClick() selectPlayer = this.playerName; GEMPlayers_UpdatePlayersList(); end function GEMPlayers_PredicateName(a, b) if (a.name < b.name) then return true; elseif (a.name > b.name) then return false; end return GEMPlayers_PredicateGuild(a, b); end function GEMPlayers_PredicateGuild(a, b) if (a.guild < b.guild) then return true; elseif (a.guild > b.guild) then return false; end return GEMPlayers_PredicateLocation(a, b); end function GEMPlayers_PredicateLocation(a, b) if (a.location < b.location) then return true; elseif (a.location > b.location) then return false; end return GEMPlayers_PredicateLevel(a, b); end function GEMPlayers_PredicateLevel(a, b) if (a.level < b.level) then return true; elseif (a.level > b.level) then return false; end return GEMPlayers_PredicateClass(a, b); end function GEMPlayers_PredicateClass(a, b) if (a.class < b.class) then return true; elseif (a.class > b.class) then return false; end return false; end function GEMPlayers_Predicate(a, b) -- a ou b est nil if (a == nil) then if (b == nil) then return false; else return true; end elseif (b == nil) then return false; end GEM_SORTBY = { [GEM_PLAYERS_SORTBY_NAME] = GEMPlayers_PredicateName, [GEM_PLAYERS_SORTBY_GUILD] = GEMPlayers_PredicateGuild, [GEM_PLAYERS_SORTBY_LOCATION] = GEMPlayers_PredicateLocation, [GEM_PLAYERS_SORTBY_LEVEL] = GEMPlayers_PredicateLevel, [GEM_PLAYERS_SORTBY_CLASS] = GEMPlayers_PredicateClass }; predicate = GEM_SORTBY[sortTypePlayers]; return predicate(a,b); end function GEMPlayers_SortBy(aSortType, aSortDir) sortTypePlayers = aSortType; sortDirPlayers = aSortDir; GEMPlayers_UpdatePlayersList(); end function GEMPlayers_OnSeeOfflineClick() GEM_Events.realms[GEM_Realm].SeeOffline = GEMPlayersFrameSeeOffline:GetChecked(); GEMPlayers_UpdatePlayersList(); end function GEMPlayers_GetPlayers(channel) local players = {}; local shownotconnected = GEMPlayersFrameSeeOffline:GetChecked() == 1; local c_off = 0; local c_on = 0; for name,playertab in GEM_Players[GEM_Realm][channel] do if(playertab.guild == nil) then playertab.guild = ""; end; if(GEM_IsPlayerConnected(channel,name)) -- Connected then c_on = c_on + 1; tinsert(players, {name=name; guild=playertab.guild; location=playertab.location; level=playertab.level; class=playertab.class, connected=true, officer=playertab.officer }); else c_off = c_off + 1; if(shownotconnected) -- Not connected then tinsert(players, {name=name; guild=playertab.guild; location=GEM_NA_FORMAT; level=playertab.level; class=playertab.class, connected=false, officer=playertab.officer }); end end end table.sort(players,GEMPlayers_Predicate); if(not sortDirPlayers) then players = GEMList_InvertList(players); end return players,c_on,c_off; end function GEMPlayers_UpdatePlayersList() if(not GEMPlayersFrame:IsVisible()) then return; end local players,c_on,c_off = GEMPlayers_GetPlayers(GEM_DefaultSendChannel); local size = table.getn(players); local enableActions = false; local offset = FauxScrollFrame_GetOffset(GEMPlayerItemScrollFrame); numButtons = GEM_PLAYERS_MAXDISPLAY_EVENT; i = 1; GEMPlayersFrameWhisper:Disable(); GEMPlayersFrameInvite:Disable(); while (i <= numButtons) do local j = i + offset local prefix = "GEMPlayerItem"..i; local button = getglobal(prefix); if (j <= size) then local player = players[j]; button.playerName = player.name; getglobal(prefix.."Name"):SetText(player.name); getglobal(prefix.."Guild"):SetText(player.guild); getglobal(prefix.."Location"):SetText(player.location); getglobal(prefix.."Level"):SetText(player.level); getglobal(prefix.."Class"):SetText(player.class); if(player.connected) then getglobal(prefix.."Name"):SetTextColor(0.9,0.8,0.10); if(player.officer and player.officer ~= 0) then if(player.officer == 2) -- Guild leader then getglobal(prefix.."Guild"):SetTextColor(0.1,0.9,0.1); elseif(player.officer == 1) -- Guild officer then getglobal(prefix.."Guild"):SetTextColor(0.3,0.3,0.9); end else -- Normal member getglobal(prefix.."Guild"):SetTextColor(1,1,1); end getglobal(prefix.."Location"):SetTextColor(1,1,1); getglobal(prefix.."Level"):SetTextColor(1,1,1); getglobal(prefix.."Class"):SetTextColor(1,1,1); else getglobal(prefix.."Name"):SetTextColor(0.3,0.3,0.3); getglobal(prefix.."Guild"):SetTextColor(0.3,0.3,0.3); getglobal(prefix.."Location"):SetTextColor(0.3,0.3,0.3); getglobal(prefix.."Level"):SetTextColor(0.3,0.3,0.3); getglobal(prefix.."Class"):SetTextColor(0.3,0.3,0.3); end button:Show(); -- selected if (selectPlayer == player.name and selectPlayer ~= GEM_PlayerName) then button:LockHighlight(); if(player.connected) then enableActions = true; end else button:UnlockHighlight(); end else button.playerName = nil; button:Hide(); end i = i + 1; end GEMPlayersFrameCountString:SetText(string.format(GEM_TEXT_PLAYERS_COUNT,c_on,c_on+c_off)); FauxScrollFrame_Update(GEMPlayerItemScrollFrame, size, GEM_PLAYERS_MAXDISPLAY_EVENT, 17); if(enableActions) then GEMPlayersFrameWhisper:Enable(); GEMPlayersFrameInvite:Enable(); end end function GEMPlayers_OnShow() if(GEM_Events.realms[GEM_Realm].SeeOffline) then GEMPlayersFrameSeeOffline:SetChecked(1); else GEMPlayersFrameSeeOffline:SetChecked(0); end GEMPlayers_UpdatePlayersList(); end function GEMPlayers_OnLoad() end function GEMPlayers_WhisperOnClick() if ( not ChatFrameEditBox:IsVisible() ) then ChatFrame_OpenChat("/w "..selectPlayer.." "); else ChatFrameEditBox:SetText("/w "..selectPlayer.." "); end ChatEdit_ParseText(ChatFrame1.editBox, 0); end function GEMPlayers_InviteOnClick() InviteByName(selectPlayer); end --------------- Exported functions --------------- function GEM_PLAY_GetMyPlayerInfos(channel) local name = GEM_PlayerName; local guild,grank_name,grank_idx = GetGuildInfo("player"); local officer = 0; local location = GetRealZoneText(); local comment = GEM_Events.realms[GEM_Realm].my_names[GEM_PlayerName].comment; if(location == nil) then location = GEM_NA_FORMAT; end local level = UnitLevel("player"); local _,class = UnitClass("player"); if(IsGuildLeader() == 1) then officer = 2; elseif(CanViewOfficerNote() == 1) then officer = 1; end if(guild == nil) -- No guild, set rank idx at -1 then grank_idx = -1; end GEM_CheckPlayerGuild(); GEM_ChatDebug(GEM_DEBUG_GLOBAL,"GEM_PLAY_GetMyPlayerInfos : Channel "..tostring(channel).." for Player "..GEM_PlayerName); if(GEM_Players[GEM_Realm][channel][GEM_PlayerName] == nil) then GEM_Players[GEM_Realm][channel][GEM_PlayerName] = {}; end GEM_Players[GEM_Realm][channel][GEM_PlayerName].guild = guild; GEM_Players[GEM_Realm][channel][GEM_PlayerName].location = location; GEM_Players[GEM_Realm][channel][GEM_PlayerName].level = level; GEM_Players[GEM_Realm][channel][GEM_PlayerName].class = GEM_Classes[class]; GEM_Players[GEM_Realm][channel][GEM_PlayerName].officer = officer; GEM_Players[GEM_Realm][channel][GEM_PlayerName].grank_name = grank_name; GEM_Players[GEM_Realm][channel][GEM_PlayerName].grank_idx = grank_idx; GEM_Players[GEM_Realm][channel][GEM_PlayerName].version = GEM_VERSION; GEM_Players[GEM_Realm][channel][GEM_PlayerName].comment = comment; GEM_Players[GEM_Realm][channel][GEM_PlayerName].lastlog = time(); return name,guild,location,level,class,officer,grank_name,grank_idx,GEM_VERSION,comment; end function GEM_PLAY_FillPlayerInfos(channel,name,guild,location,level,class,officer,grank_name,grank_idx,version,comment) if(name == nil) -- Me then GEM_PLAY_GetMyPlayerInfos(channel); return; end if(guild == nil) then guild = ""; end if(GEM_Players[GEM_Realm][channel][name] == nil) then GEM_Players[GEM_Realm][channel][name] = {}; end GEM_Players[GEM_Realm][channel][name].guild = guild; GEM_Players[GEM_Realm][channel][name].location = location; GEM_Players[GEM_Realm][channel][name].level = level; GEM_Players[GEM_Realm][channel][name].class = GEM_Classes[class]; GEM_Players[GEM_Realm][channel][name].officer = officer; GEM_Players[GEM_Realm][channel][name].grank_name = grank_name; GEM_Players[GEM_Realm][channel][name].grank_idx = grank_idx; GEM_Players[GEM_Realm][channel][name].version = version; GEM_Players[GEM_Realm][channel][name].comment = comment; GEM_Players[GEM_Realm][channel][name].lastlog = time(); end function GEM_PLAY_GetLastLeave(channel,pl_name) if(channel == nil or pl_name == nil or GEM_Players[GEM_Realm] == nil or GEM_Players[GEM_Realm][channel] == nil or GEM_Players[GEM_Realm][channel][pl_name] == nil or GEM_Players[GEM_Realm][channel][pl_name].lastleave == nil) then return 0; end return GEM_Players[GEM_Realm][channel][pl_name].lastleave; end function GEMPlayers_CheckExpiredPlayers(channel) if(GEM_Players[GEM_Realm] == nil or GEM_Players[GEM_Realm][channel] == nil) then return; end GEM_ChatDebug(GEM_DEBUG_GLOBAL,"GEMPlayers_CheckExpiredPlayers : Checking expired players in channel "..channel); local tim = time(); for name,playertab in GEM_Players[GEM_Realm][channel] do if((playertab.lastlog + GEM_PLAYERS_LASTLOG_MAX) < tim) then GEM_ChatDebug(GEM_DEBUG_GLOBAL,"GEMPlayers_CheckExpiredPlayers : Too long since last log from player "..name.." in channel "..channel..", Removing !"); GEM_Players[GEM_Realm][channel][name] = nil; end end end