Files
ElvUIModernized/ElvUI/Modules/DataTexts/Guild.lua
T
2018-07-13 23:25:17 -05:00

232 lines
7.8 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local DT = E:GetModule("DataTexts")
--Cache global variables
--Lua functions
local select, unpack = select, unpack
local format, find, join, upper = string.format, string.find, string.join, string.upper
local getn, sort, wipe = table.getn, table.sort, table.wipe
--WoW API / Variables
local CreateFrame = CreateFrame
local GetGuildInfo = GetGuildInfo
local GetGuildRosterInfo = GetGuildRosterInfo
local GetGuildRosterMOTD = GetGuildRosterMOTD
local GetMouseFocus = GetMouseFocus
local GetNumGuildMembers = GetNumGuildMembers
local GetQuestDifficultyColor = GetQuestDifficultyColor
local GetRealZoneText = GetRealZoneText
local GuildRoster = GuildRoster
local InviteByName = InviteByName
local IsInGuild = IsInGuild
local IsShiftKeyDown = IsShiftKeyDown
local L_EasyMenu = L_EasyMenu
local SetItemRef = SetItemRef
local ToggleFriendsFrame = ToggleFriendsFrame
local CHAT_MSG_WHISPER_INFORM, GUILD, GUILD_MOTD, GUILD_ONLINE_LABEL, GUILD_RANK1_DESC = CHAT_MSG_WHISPER_INFORM, GUILD, GUILD_MOTD, GUILD_ONLINE_LABEL, GUILD_RANK1_DESC
local LABEL_NOTE, OPTIONS_MENU, PARTY_INVITE = LABEL_NOTE, OPTIONS_MENU, PARTY_INVITE
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
local tthead, ttsubh, ttoff = {r=0.4, g=0.78, b=1}, {r=0.75, g=0.9, b=1}, {r=.3,g=1,b=.3}
local activezone, inactivezone = {r=0.3, g=1.0, b=0.3}, {r=0.65, g=0.65, b=0.65}
local groupedTable = { "|cffaaaaaa*|r", "" }
local displayString = ""
local noGuildString = ""
local guildInfoString = "%s"
local guildInfoString2 = join("", GUILD, ": %d/%d")
local guildMotDString = "%s |cffaaaaaa- |cffffffff%s"
local levelNameString = "|cff%02x%02x%02x%d|r |cff%02x%02x%02x%s|r %s"
local levelNameStatusString = "|cff%02x%02x%02x%d|r %s"
local nameRankString = "%s |cff999999-|cffffffff %s"
local moreMembersOnlineString = join("", "+ %d ", GUILD_ONLINE_LABEL, "...")
local noteString = join("", "|cff999999 ", LABEL_NOTE, ":|r %s")
local officerNoteString = join("", "|cff999999 ", GUILD_RANK1_DESC, ":|r %s")
local guildTable, guildMotD = {}, ""
local lastPanel
local function sortByRank(a, b)
if a and b then
return a[9] < b[9]
end
end
local function sortByName(a, b)
if a and b then
return a[1] < b[1]
end
end
local function SortGuildTable(shift)
if shift then
sort(guildTable, sortByRank)
else
sort(guildTable, sortByName)
end
end
local function BuildGuildTable()
wipe(guildTable)
local name, rank, rankIndex, level, class, zone, note, officernote, online
local totalMembers = GetNumGuildMembers()
for i = 1, totalMembers do
name, rank, rankIndex, level, class, zone, note, officernote, online = GetGuildRosterInfo(i)
if not name then break end
if online then
guildTable[getn(guildTable) + 1] = {name, rank, level, zone, note, officernote, online, upper(class), rankIndex}
end
end
end
local eventHandlers = {
-- when we enter the world and guildframe is not available then
-- load guild frame, update guild message
["PLAYER_ENTERING_WORLD"] = function()
guildMotD = GetGuildRosterMOTD()
end,
-- Guild Roster updated, so rebuild the guild table
["GUILD_ROSTER_UPDATE"] = function(self)
GuildRoster()
BuildGuildTable()
guildMotD = GetGuildRosterMOTD()
if GetMouseFocus() == self then
self:GetScript("OnEnter")(self, nil, true)
end
end,
["PLAYER_GUILD_UPDATE"] = GuildRoster,
-- our guild message of the day changed
["GUILD_MOTD"] = function()
guildMotD = arg1
end,
["ELVUI_FORCE_RUN"] = GuildRoster,
["ELVUI_COLOR_UPDATE"] = E.noop,
}
local function OnEvent(self, event, ...)
lastPanel = self
if IsInGuild() then
eventHandlers[event](self, unpack(arg))
self.text:SetText(format(displayString, getn(guildTable)))
else
self.text:SetText(noGuildString)
end
end
local menuFrame = CreateFrame("Frame", "GuildDatatTextRightClickMenu", E.UIParent, "L_UIDropDownMenuTemplate")
local menuList = {
{text = OPTIONS_MENU, isTitle = true, notCheckable = true},
{text = PARTY_INVITE, hasArrow = true, notCheckable = true},
{text = CHAT_MSG_WHISPER_INFORM, hasArrow = true, notCheckable = true}
}
local function inviteClick(playerName)
menuFrame:Hide()
InviteByName(playerName)
end
local function whisperClick(playerName)
menuFrame:Hide()
SetItemRef("player:"..playerName, format("|Hplayer:%1$s|h[%1$s]|h", playerName), "LeftButton")
end
local function OnClick()
if arg1 == "RightButton" and IsInGuild() then
DT.tooltip:Hide()
local classc, levelc, info
local menuCountWhispers = 0
local menuCountInvites = 0
menuList[2].menuList = {}
menuList[3].menuList = {}
for i = 1, getn(guildTable) do
info = guildTable[i]
if info[7] and info[1] ~= E.myname then
classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[info[8]], GetQuestDifficultyColor(info[3])
menuCountInvites = menuCountInvites + 1
menuList[2].menuList[menuCountInvites] = {text = format(levelNameString, levelc.r*255,levelc.g*255,levelc.b*255, info[3], classc.r*255,classc.g*255,classc.b*255, info[1], ""), arg1 = info[1],notCheckable=true, func = inviteClick}
menuCountWhispers = menuCountWhispers + 1
menuList[3].menuList[menuCountWhispers] = {text = format(levelNameString, levelc.r*255,levelc.g*255,levelc.b*255, info[3], classc.r*255,classc.g*255,classc.b*255, info[1], ""), arg1 = info[1],notCheckable=true, func = whisperClick}
end
end
L_EasyMenu(menuList, menuFrame, "cursor", 0, 0, "MENU", 2)
else
ToggleFriendsFrame(3)
end
end
local function OnEnter(self, _, noUpdate)
if not IsInGuild() then return end
DT:SetupTooltip(self)
local online, total = 0, GetNumGuildMembers(true)
for i = 0, total do if select(9, GetGuildRosterInfo(i)) then online = online + 1 end end
if getn(guildTable) == 0 then BuildGuildTable() end
SortGuildTable(IsShiftKeyDown())
local guildName, guildRank = GetGuildInfo("player")
if guildName and guildRank then
DT.tooltip:AddDoubleLine(format(guildInfoString, guildName), format(guildInfoString2, online, total),tthead.r,tthead.g,tthead.b,tthead.r,tthead.g,tthead.b)
DT.tooltip:AddLine(guildRank, unpack(tthead))
end
if guildMotD ~= "" then
DT.tooltip:AddLine(" ")
DT.tooltip:AddLine(format(guildMotDString, GUILD_MOTD, guildMotD), ttsubh.r, ttsubh.g, ttsubh.b, 1)
end
local zonec, classc, levelc, info
local shown = 0
DT.tooltip:AddLine(" ")
for i = 1, getn(guildTable) do
-- if more then 30 guild members are online, we don't Show any more, but inform user there are more
if 30 - shown <= 1 then
if online - 30 > 1 then DT.tooltip:AddLine(format(moreMembersOnlineString, online - 30), ttsubh.r, ttsubh.g, ttsubh.b) end
break
end
info = guildTable[i]
if GetRealZoneText() == info[4] then zonec = activezone else zonec = inactivezone end
classc, levelc = (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[info[8]], GetQuestDifficultyColor(info[3])
if IsShiftKeyDown() then
DT.tooltip:AddDoubleLine(format(nameRankString, info[1], info[2]), info[4], classc.r, classc.g, classc.b, zonec.r, zonec.g, zonec.b)
if info[5] ~= "" then DT.tooltip:AddLine(format(noteString, info[5]), ttsubh.r, ttsubh.g, ttsubh.b, 1) end
if info[6] ~= "" then DT.tooltip:AddLine(format(officerNoteString, info[6]), ttoff.r, ttoff.g, ttoff.b, 1) end
else
DT.tooltip:AddDoubleLine(format(levelNameStatusString, levelc.r*255, levelc.g*255, levelc.b*255, info[3], info[1], " " .. info[8]), info[4], classc.r,classc.g,classc.b, zonec.r,zonec.g,zonec.b)
end
shown = shown + 1
end
DT.tooltip:Show()
if not noUpdate then
GuildRoster()
end
end
local function ValueColorUpdate(hex)
displayString = join("", GUILD, ": ", hex, "%d|r")
noGuildString = join("", hex, L["No Guild"])
if lastPanel ~= nil then
OnEvent(lastPanel, "ELVUI_COLOR_UPDATE")
end
end
E["valueColorUpdateFuncs"][ValueColorUpdate] = true
DT:RegisterDatatext("Guild", {"PLAYER_ENTERING_WORLD", "GUILD_ROSTER_UPDATE", "PLAYER_GUILD_UPDATE", "GUILD_MOTD"}, OnEvent, nil, OnClick, OnEnter, nil, GUILD)