local compost = AceLibrary("Compost-2.0") local tablet = AceLibrary("Tablet-2.0") local BC = AceLibrary("Babble-Class-2.0") local T = AceLibrary("Tourist-2.0") local R = AceLibrary("RosterLib-2.0") local L = AceLibrary("AceLocale-2.0"):new("FuBar_GuildFu") FuBar_GuildFu = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceConsole-2.0", "AceDB-2.0", "FuBarPlugin-2.0") FuBar_GuildFu.hasIcon = true FuBar_GuildFu.hasNoColor = true FuBar_GuildFu.clickableTooltip = true FuBar_GuildFu:RegisterDB("FuBar_GuildFuDB") FuBar_GuildFu:RegisterDefaults("profile", { text = { show_displayed = true, show_online = true, show_total = true, }, tooltip = { sort = "ZONE", group_show = true, name_color = "CLASS", name_status = true, class_show = false, level_show = true, level_color = "RELATIVE", zone_show = true, zone_color = "FACTION", note_showpublic = true, note_showofficer = true, note_showauldlangsyne = true, rank_show = true, }, filter = { class_druid = true, class_hunter = true, class_mage = true, class_paladin = true, class_priest = true, class_rogue = true, class_shaman = true, class_warlock = true, class_warrior = true, level_0109 = true, level_1019 = true, level_2029 = true, level_3039 = true, level_4049 = true, level_5059 = true, level_60 = true, zone_bg = true, zone_inst = true, zone_open = true, } }) function FuBar_GuildFu:OnInitialize() self.lastUpdate = 0 end function FuBar_GuildFu:OnEnable() self:RegisterEvent("PLAYER_GUILD_UPDATE") R:Enable() self:RegisterEvent("RosterLib_RosterChanged", "UpdateTooltip") if IsInGuild() then self:ScheduleRepeatingEvent("ScheduledGuildRoster", GuildRoster, 15) self:RegisterEvent("GUILD_ROSTER_UPDATE") GuildRoster() end end function FuBar_GuildFu:GUILD_ROSTER_UPDATE() if not arg1 or (arg1 and arg7 and arg8) then -- print("[GuildFu] GUILD_ROSTER_UPDATE fired with args...", arg1) self:Update() end end function FuBar_GuildFu:PLAYER_GUILD_UPDATE() if IsInGuild() then if not self:IsEventRegistered("GUILD_ROSTER_UPDATE") then self:ScheduleRepeatingEvent("ScheduledGuildRoster", GuildRoster, 15) self:RegisterEvent("GUILD_ROSTER_UPDATE") end GuildRoster() else if self:IsEventRegistered("GUILD_ROSTER_UPDATE") then self:CancelScheduledEvent("ScheduledGuildRoster") self:UnregisterEvent("GUILD_ROSTER_UPDATE") end end end function FuBar_GuildFu:OnDisable() R:Disable() end local function table_multiinsert(...) if arg.n < 2 or type(arg[1]) ~= "table" then return end for i = 2, arg.n, 1 do table.insert(arg[1], arg[i]) end end FuBar_GuildFu.sorts ={ NAME = function(a,b) return a[1]b[5] then return false else if a[4]b[4] then return false else return FuBar_GuildFu.sorts.NAME(a, b) end end end, LEVEL = function(a,b) if a[4]b[4] then return false else if a[5]b[5] then return false else return FuBar_GuildFu.sorts.NAME(a, b) end end end, ZONE = function(a,b) if a[6]b[6] then return false else return FuBar_GuildFu.sorts.CLASS(a, b) end end, RANK = function(a,b) if a[3]b[3] then return false else return FuBar_GuildFu.sorts.CLASS(a, b) end end, } function FuBar_GuildFu:OnDataUpdate() if time() <= self.lastUpdate + 1 then return end self.lastUpdate = time() if self.players then self.players = compost.Reclaim(self.players, 1) end self.players = compost:Acquire() self.playersShown = 0 self.playersOnline = 0 self.playersTotal = 0 if IsInGuild() then SetGuildRosterShowOffline(1) local numGuildMembers = GetNumGuildMembers() local name, rank, rankIndex, level, class, zone, note, officernote, online, status for i = 1, numGuildMembers, 1 do name, rank, rankIndex, level, class, zone, note, officernote, online, status = GetGuildRosterInfo(i) if note == "" then note = nil end if officernote == "" then officernote = nil end if not zone then zone = UNKNOWN end if online then self.playersOnline = self.playersOnline + 1 if self:checkFilter(class, level, zone) then self.playersShown = self.playersShown + 1 table.insert(self.players, compost:Acquire(name, rank, rankIndex, level, class, zone, status, note, officernote)) end end end table.sort(self.players, self.sorts[self.db.profile.tooltip.sort]) self.playersTotal = numGuildMembers SetGuildRosterShowOffline(SHOW_OFFLINE_GUILD_MEMBERS) end end function FuBar_GuildFu:OnTextUpdate() if not IsInGuild() then self:SetText(L"No Guild") return end if self.playersTotal == 0 then self:SetText(L"Updating...") return end local temptext = "" if self.db.profile.text.show_displayed then temptext = temptext..self.playersShown end if self.db.profile.text.show_online then if temptext ~= "" then temptext = temptext.."/" end temptext = temptext..self.playersOnline end if self.db.profile.text.show_total then if temptext ~= "" then temptext = temptext.."/" end temptext = temptext..self.playersTotal end if temptext ~= "" then self:SetText(temptext) else self:SetText("") end end function FuBar_GuildFu:OnTooltipUpdate() if not IsInGuild() then local cat = tablet:AddCategory( 'columns', 1, 'text', L"You aren't in a guild.", 'hideBlankLine', true, 'showWithoutChildren', true ) return end if self.playersShown == 0 then local cat = tablet:AddCategory( 'columns', 1, 'text', L"All guild mates offline or filtered.", 'hideBlankLine', true, 'showWithoutChildren', true ) return end local AuldLangSyne_loaded = IsAddOnLoaded("AuldLangSyne") local cols = compost:Acquire() table.insert(cols, L"Name") if self.db.profile.tooltip.class_show then table.insert(cols, L"Class") end if self.db.profile.tooltip.level_show then table.insert(cols, L"Level") end if self.db.profile.tooltip.zone_show then table.insert(cols, L"Zone") end if self.db.profile.tooltip.note_showpublic or (self.db.profile.tooltip.note_showofficer and CanViewOfficerNote()) or (AuldLangSyne_loaded and self.db.profile.tooltip.note_showauldlangsyne) then table.insert(cols, L"Notes") end if self.db.profile.tooltip.rank_show then table.insert(cols, L"Rank") end local cat = tablet:AddCategory( 'columns', table.getn(cols) ) local header = compost:Acquire() for i = 1, table.getn(cols) do if i == 1 then -- table_multiinsert(header, 'text', cols[i], 'textR', 1, 'textG', 1, 'textB', 1, 'justify', "CENTER") table_multiinsert(header, 'text', cols[i], 'justify', "CENTER") else -- table_multiinsert(header, 'text'..i, cols[i], 'text'..i..'R', 1, 'text'..i..'G', 1, 'text'..i..'B', 1, 'justify'..i, "CENTER") table_multiinsert(header, 'text'..i, cols[i], 'justify'..i, "CENTER") end end cat:AddLine(unpack(header)) cols = compost:Reclaim(cols) header = compost:Reclaim(header) local line local colcount local temptext local classcolorR, classcolorG, classcolorG local levelcolor local zonecolorR, zonecolorG, zonecolorB for i = 1, table.getn(self.players) do classcolorR, classcolorG, classcolorB = BC:GetColor(self.players[i][5]) levelcolor = GetDifficultyColor(self.players[i][4]) line = compost:Acquire() if self.db.profile.tooltip.name_status and self.players[i][7] ~= "" then table_multiinsert(line, 'text', self.players[i][7].." "..self.players[i][1]) else table_multiinsert(line, 'text', self.players[i][1]) end if self.db.profile.tooltip.name_color == "CLASS" then table_multiinsert(line, 'textR', classcolorR, 'textG', classcolorG, 'textB', classcolorB) else table_multiinsert(line, 'textR', 1, 'textG', 1, 'textB', 0) end colcount = 1 if self.db.profile.tooltip.class_show then colcount = colcount + 1 table.insert(line, 'text'..colcount) table.insert(line, self.players[i][5]) table_multiinsert(line, 'text'..colcount..'R', classcolorR, 'text'..colcount..'G', classcolorG, 'text'..colcount..'B', classcolorB) end if self.db.profile.tooltip.level_show then colcount = colcount + 1 table.insert(line, 'text'..colcount) table.insert(line, self.players[i][4]) table_multiinsert(line, 'text'..colcount..'R', levelcolor.r, 'text'..colcount..'G', levelcolor.g, 'text'..colcount..'B', levelcolor.b) end if self.db.profile.tooltip.zone_show then colcount = colcount + 1 table.insert(line, 'text'..colcount) table.insert(line, self.players[i][6]) if self.db.profile.tooltip.zone_color == "FACTION" then zonecolorR, zonecolorG, zonecolorB = T:GetFactionColor(self.players[i][6]) elseif self.db.profile.tooltip.zone_color == "LEVEL" then zonecolorR, zonecolorG, zonecolorB = T:GetLevelColor(self.players[i][6]) else zonecolorR, zonecolorG, zonecolorB = 1, 1, 0 end table_multiinsert(line, 'text'..colcount..'R', zonecolorR, 'text'..colcount..'G', zonecolorG, 'text'..colcount..'B', zonecolorB) end if self.db.profile.tooltip.note_showpublic or (self.db.profile.tooltip.note_showofficer and CanViewOfficerNote()) or (AuldLangSyne_loaded and self.db.profile.tooltip.note_showauldlangsyne) then colcount = colcount + 1 table.insert(line, 'text'..colcount) temptext = "" if self.db.profile.tooltip.note_showpublic then temptext = ((self.players[i][8] and (" ["..self.players[i][8].."] ")) or " - ") end if self.db.profile.tooltip.note_showofficer and CanViewOfficerNote() then temptext = temptext..((self.players[i][9] and (" ["..self.players[i][9].."] ")) or " - ") end if AuldLangSyne_loaded and self.db.profile.tooltip.note_showauldlangsyne then temptext = temptext ..((AuldLangSyne.db.realm.guild[self.players[i][1]] and (" {"..AuldLangSyne.db.realm.guild[self.players[i][1]].."} ")) or "") end table.insert(line, temptext) table_multiinsert(line, 'text'..colcount..'R', 1, 'text'..colcount..'G', 1, 'text'..colcount..'B', 0) end if self.db.profile.tooltip.rank_show then colcount = colcount + 1 table.insert(line, 'text'..colcount) table.insert(line, self.players[i][2]) table_multiinsert(line, 'text'..colcount..'R', 1, 'text'..colcount..'G', 1, 'text'..colcount..'B', 0) end table_multiinsert(line, 'func', 'OnNameClick', 'arg1', self, 'arg2', self.players[i][1]) if self.db.profile.tooltip.group_show then table_multiinsert(line, 'hasCheck', true, 'checked', R:GetUnitIDFromName(self.players[i][1]) and true) -- 'checkIcon', self.factions[i].isCollapsed and "Interface\\Buttons\\UI-PlusButton-Up" or "Interface\\Buttons\\UI-MinusButton-Up", end cat:AddLine(unpack(line)) line = compost:Reclaim(line) end end function FuBar_GuildFu:OnClick() ToggleFriendsFrame(3) end function FuBar_GuildFu:OnNameClick(name) if not name then return end if IsAltKeyDown() then InviteByName(name) else SetItemRef("player:"..name, "|Hplayer:"..name.."|h["..name.."|h", "LeftButton") end end function FuBar_GuildFu:checkFilter(class, level, zone) if not self.db.profile.filter.class_druid and class == BC"Druid" then return false end if not self.db.profile.filter.class_hunter and class == BC"Hunter" then return false end if not self.db.profile.filter.class_mage and class == BC"Mage" then return false end if not self.db.profile.filter.class_paladin and class == BC"Paladin" then return false end if not self.db.profile.filter.class_priest and class == BC"Priest" then return false end if not self.db.profile.filter.class_rogue and class == BC"Rogue" then return false end if not self.db.profile.filter.class_shaman and class == BC"Shaman" then return false end if not self.db.profile.filter.class_warlock and class == BC"Warlock" then return false end if not self.db.profile.filter.class_warrior and class == BC"Warrior" then return false end if not self.db.profile.filter.level_0109 and level < 10 then return false end if not self.db.profile.filter.level_1019 and level >= 10 and level < 20 then return false end if not self.db.profile.filter.level_2029 and level >= 20 and level < 30 then return false end if not self.db.profile.filter.level_3039 and level >= 30 and level < 40 then return false end if not self.db.profile.filter.level_4049 and level >= 40 and level < 50 then return false end if not self.db.profile.filter.level_5059 and level >= 50 and level < 60 then return false end if not self.db.profile.filter.level_60 and level == 60 then return false end if not self.db.profile.filter.zone_bg and T:IsBattleground(zone) then return false end if not self.db.profile.filter.zone_inst and T:IsInstance(zone) and not T:IsBattleground(zone) then return false end if not self.db.profile.filter.zone_open and T:IsZone(zone) then return false end return true end