Added a feature to assign red/blue side for gnarlmoon
This commit is contained in:
+312
@@ -0,0 +1,312 @@
|
||||
local T = AceLibrary("Tablet-2.0")
|
||||
local D = AceLibrary("Dewdrop-2.0")
|
||||
local C = AceLibrary("Crayon-2.0")
|
||||
|
||||
local BC = AceLibrary("Babble-Class-2.2")
|
||||
local L = AceLibrary("AceLocale-2.2"):new("shootyepgp")
|
||||
|
||||
sepgp_installs_window = sepgp:NewModule("sepgp_installs_window", "AceDB-2.0", "AceEvent-2.0")
|
||||
|
||||
function sepgp_installs_window:OnEnable()
|
||||
if not T:IsRegistered("sepgp_installs_window") then
|
||||
T:Register("sepgp_installs_window",
|
||||
"children", function()
|
||||
T:SetTitle(L["shootyepgp addon installs"])
|
||||
self:OnTooltipUpdate()
|
||||
end,
|
||||
"showTitleWhenDetached", true,
|
||||
"showHintWhenDetached", true,
|
||||
"cantAttach", true,
|
||||
"menu", function()
|
||||
D:AddLine(
|
||||
"text", L["Refresh"],
|
||||
"tooltipText", L["Refresh window"],
|
||||
"func", function() sepgp_installs_window:Refresh() end
|
||||
)
|
||||
D:AddLine(
|
||||
"text", L["Send Ping"],
|
||||
"tooltipText", L["Send a ping to detect updated clients"],
|
||||
"func", function()
|
||||
sepgp:addonMessage("PING","GUILD")
|
||||
if GetNumRaidMembers() > 0 then
|
||||
sepgp:addonMessage("PING","RAID")
|
||||
elseif GetNumPartyMembers() > 0 then
|
||||
sepgp:addonMessage("PING","PARTY")
|
||||
end
|
||||
end
|
||||
)
|
||||
D:AddLine(
|
||||
"text", L["Clear"],
|
||||
"tooltipText", L["Clear cache and rescan"],
|
||||
"func", function() sepgp_installs_window:ClearAndRescan() end
|
||||
)
|
||||
end
|
||||
)
|
||||
end
|
||||
if not T:IsAttached("sepgp_installs_window") then
|
||||
T:Open("sepgp_installs_window")
|
||||
end
|
||||
end
|
||||
|
||||
function sepgp_installs_window:OnDisable()
|
||||
T:Close("sepgp_installs_window")
|
||||
if self:IsEventScheduled("AutoRefreshInstalls") then
|
||||
self:CancelScheduledEvent("AutoRefreshInstalls")
|
||||
end
|
||||
end
|
||||
|
||||
function sepgp_installs_window:Refresh()
|
||||
T:Refresh("sepgp_installs_window")
|
||||
end
|
||||
|
||||
function sepgp_installs_window:setHideScript()
|
||||
local i = 1
|
||||
local tablet = getglobal(string.format("Tablet20DetachedFrame%d",i))
|
||||
while (tablet) and i<100 do
|
||||
if tablet.owner ~= nil and tablet.owner == "sepgp_installs_window" then
|
||||
sepgp:make_escable(string.format("Tablet20DetachedFrame%d",i),"add")
|
||||
tablet:SetScript("OnHide",nil)
|
||||
tablet:SetScript("OnHide",function()
|
||||
if not T:IsAttached("sepgp_installs_window") then
|
||||
T:Attach("sepgp_installs_window")
|
||||
this:SetScript("OnHide",nil)
|
||||
-- Stop auto-refresh when window closes
|
||||
if sepgp_installs_window:IsEventScheduled("AutoRefreshInstalls") then
|
||||
sepgp_installs_window:CancelScheduledEvent("AutoRefreshInstalls")
|
||||
end
|
||||
end
|
||||
end)
|
||||
break
|
||||
end
|
||||
i = i+1
|
||||
tablet = getglobal(string.format("Tablet20DetachedFrame%d",i))
|
||||
end
|
||||
end
|
||||
|
||||
function sepgp_installs_window:Top()
|
||||
if T:IsRegistered("sepgp_installs_window") and (T.registry.sepgp_installs_window.tooltip) then
|
||||
T.registry.sepgp_installs_window.tooltip.scroll=0
|
||||
end
|
||||
end
|
||||
|
||||
function sepgp_installs_window:Toggle(forceShow)
|
||||
self:Top()
|
||||
if T:IsAttached("sepgp_installs_window") then
|
||||
T:Detach("sepgp_installs_window")
|
||||
if (T:IsLocked("sepgp_installs_window")) then
|
||||
T:ToggleLocked("sepgp_installs_window")
|
||||
end
|
||||
self:setHideScript()
|
||||
-- Start auto-refresh when window is opened
|
||||
if not self:IsEventScheduled("AutoRefreshInstalls") then
|
||||
self:ScheduleRepeatingEvent("AutoRefreshInstalls", self.AutoRefresh, 5, self)
|
||||
end
|
||||
-- Send a ping when opening the window to guild and raid
|
||||
sepgp:addonMessage("PING","GUILD")
|
||||
if GetNumRaidMembers() > 0 then
|
||||
sepgp:addonMessage("PING","RAID")
|
||||
elseif GetNumPartyMembers() > 0 then
|
||||
sepgp:addonMessage("PING","PARTY")
|
||||
end
|
||||
|
||||
-- Also broadcast our VERSION so even old clients can detect us
|
||||
local versionMsg = string.format("VERSION;%s;1", sepgp._versionString)
|
||||
sepgp:addonMessage(versionMsg,"GUILD")
|
||||
if GetNumRaidMembers() > 0 then
|
||||
sepgp:addonMessage(versionMsg,"RAID")
|
||||
elseif GetNumPartyMembers() > 0 then
|
||||
sepgp:addonMessage(versionMsg,"PARTY")
|
||||
end
|
||||
else
|
||||
if (forceShow) then
|
||||
sepgp_installs_window:Refresh()
|
||||
else
|
||||
T:Attach("sepgp_installs_window")
|
||||
-- Stop auto-refresh when window closes
|
||||
if self:IsEventScheduled("AutoRefreshInstalls") then
|
||||
self:CancelScheduledEvent("AutoRefreshInstalls")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function sepgp_installs_window:AutoRefresh()
|
||||
if not T:IsAttached("sepgp_installs_window") then
|
||||
self:Refresh()
|
||||
end
|
||||
end
|
||||
|
||||
function sepgp_installs_window:ClearAndRescan()
|
||||
-- Clear the cached data
|
||||
sepgp_installs = {}
|
||||
|
||||
-- Send pings to all channels
|
||||
sepgp:addonMessage("PING","GUILD")
|
||||
if GetNumRaidMembers() > 0 then
|
||||
sepgp:addonMessage("PING","RAID")
|
||||
elseif GetNumPartyMembers() > 0 then
|
||||
sepgp:addonMessage("PING","PARTY")
|
||||
end
|
||||
|
||||
-- Also broadcast our VERSION so even old clients can detect us
|
||||
local versionMsg = string.format("VERSION;%s;1", sepgp._versionString)
|
||||
sepgp:addonMessage(versionMsg,"GUILD")
|
||||
if GetNumRaidMembers() > 0 then
|
||||
sepgp:addonMessage(versionMsg,"RAID")
|
||||
elseif GetNumPartyMembers() > 0 then
|
||||
sepgp:addonMessage(versionMsg,"PARTY")
|
||||
end
|
||||
|
||||
-- Wait a moment for responses, then refresh
|
||||
self:ScheduleEvent("ClearAndRescanRefresh", function()
|
||||
sepgp_installs_window:Refresh()
|
||||
end, 2, self)
|
||||
|
||||
-- Show message
|
||||
sepgp:defaultPrint(L["Cache cleared. Rescanning..."])
|
||||
end
|
||||
|
||||
function sepgp_installs_window:OnTooltipUpdate()
|
||||
local has_data = false
|
||||
|
||||
if sepgp_installs and next(sepgp_installs) then
|
||||
has_data = true
|
||||
end
|
||||
|
||||
if not has_data then
|
||||
local cat = T:AddCategory(
|
||||
"text", L["No Data"],
|
||||
"columns", 1
|
||||
)
|
||||
cat:AddLine(
|
||||
"text", L["No players detected yet. Players will be detected automatically as they use the addon."]
|
||||
)
|
||||
T:SetHint(L["Wait for players to use addon features or login."])
|
||||
return
|
||||
end
|
||||
|
||||
-- Build list of online players with addon
|
||||
local online = {}
|
||||
local offline = {}
|
||||
local num_total = GetNumGuildMembers(true)
|
||||
|
||||
-- First, add guild members with roster info
|
||||
for i = 1, num_total do
|
||||
local name, rank, rankIndex, level, class, zone, note, officernote, online_status = GetGuildRosterInfo(i)
|
||||
if name and sepgp_installs[name] then
|
||||
local player_data = {
|
||||
name = name,
|
||||
class = class or sepgp_installs[name].class,
|
||||
level = level or "??",
|
||||
zone = zone or L["Unknown"],
|
||||
version = sepgp_installs[name].version or L["Unknown"],
|
||||
rank = rank or sepgp_installs[name].rank or L["Unknown"],
|
||||
}
|
||||
if online_status then
|
||||
table.insert(online, player_data)
|
||||
else
|
||||
table.insert(offline, player_data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Then, add any non-guild players (from raid/party) that aren't already in the list
|
||||
for name, data in pairs(sepgp_installs) do
|
||||
local already_added = false
|
||||
for _, player in ipairs(online) do
|
||||
if player.name == name then
|
||||
already_added = true
|
||||
break
|
||||
end
|
||||
end
|
||||
for _, player in ipairs(offline) do
|
||||
if player.name == name then
|
||||
already_added = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not already_added then
|
||||
-- This is a non-guild member, check if they're online via recent activity
|
||||
local time_since = time() - (data.time or 0)
|
||||
local is_online = time_since < 300 -- Consider online if seen in last 5 minutes
|
||||
|
||||
local player_data = {
|
||||
name = name,
|
||||
class = data.class or "Unknown",
|
||||
level = "??",
|
||||
zone = L["Unknown"],
|
||||
version = data.version or L["Unknown"],
|
||||
rank = data.rank or L["Unknown"],
|
||||
}
|
||||
|
||||
if is_online then
|
||||
table.insert(online, player_data)
|
||||
else
|
||||
table.insert(offline, player_data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Sort by name
|
||||
table.sort(online, function(a, b) return a.name < b.name end)
|
||||
table.sort(offline, function(a, b) return a.name < b.name end)
|
||||
|
||||
-- Display online players
|
||||
if table.getn(online) > 0 then
|
||||
local cat = T:AddCategory(
|
||||
"text", C:Green(string.format(L["Online (%d)"], table.getn(online))),
|
||||
"columns", 5
|
||||
)
|
||||
cat:AddLine(
|
||||
"text", C:White(L["Name"]),
|
||||
"text2", C:White(L["Level"]),
|
||||
"text3", C:White(L["Rank"]),
|
||||
"text4", C:White(L["Zone"]),
|
||||
"text5", C:White(L["Version"])
|
||||
)
|
||||
for _, player in ipairs(online) do
|
||||
local classColor = BC:GetHexColor(player.class) or "ffffff"
|
||||
cat:AddLine(
|
||||
"text", C:Colorize(classColor, player.name),
|
||||
"text2", tostring(player.level),
|
||||
"text3", player.rank,
|
||||
"text4", player.zone,
|
||||
"text5", player.version
|
||||
)
|
||||
end
|
||||
else
|
||||
local cat = T:AddCategory(
|
||||
"text", C:Green(L["Online (0)"]),
|
||||
"columns", 1
|
||||
)
|
||||
cat:AddLine(
|
||||
"text", L["No online players detected yet."]
|
||||
)
|
||||
end
|
||||
|
||||
-- Display offline players (collapsed by default)
|
||||
if table.getn(offline) > 0 then
|
||||
local cat = T:AddCategory(
|
||||
"text", C:Colorize("999999", string.format(L["Offline (%d)"], table.getn(offline))),
|
||||
"columns", 4
|
||||
)
|
||||
cat:AddLine(
|
||||
"text", C:White(L["Name"]),
|
||||
"text2", C:White(L["Level"]),
|
||||
"text3", C:White(L["Rank"]),
|
||||
"text4", C:White(L["Version"])
|
||||
)
|
||||
for _, player in ipairs(offline) do
|
||||
local classColor = BC:GetHexColor(player.class) or "888888"
|
||||
cat:AddLine(
|
||||
"text", C:Colorize(classColor, player.name),
|
||||
"text2", tostring(player.level),
|
||||
"text3", player.rank,
|
||||
"text4", player.version
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
T:SetHint(L["Right-click for options. Updates every 5 seconds."])
|
||||
end
|
||||
Reference in New Issue
Block a user