режим предателя + UI референсы и DragonUI
This commit is contained in:
@@ -0,0 +1,460 @@
|
||||
-- global data
|
||||
HELPFRAME_BULLET_SPACING = -3;
|
||||
HELPFRAME_SECTION_SPACING = -20;
|
||||
GMTICKET_CHECK_INTERVAL = 600; -- 10 Minutes
|
||||
|
||||
HELPFRAME_START_PAGE = "KBase";
|
||||
|
||||
|
||||
-- local data
|
||||
|
||||
-- helpFrames contains the names of all the frames that can go into the frameStack
|
||||
local helpFrames = {
|
||||
["GMTalk"] = "HelpFrameGMTalk",
|
||||
["Stuck"] = "HelpFrameStuck",
|
||||
["ReportIssue"] = "HelpFrameReportIssue",
|
||||
["OpenTicket"] = "HelpFrameOpenTicket",
|
||||
["GMResponse"] = "HelpFrameViewResponse",
|
||||
["NeedMoreHelp"] = "HelpFrameOpenTicket",
|
||||
["Welcome"] = "HelpFrameWelcome",
|
||||
["KBase"] = "KnowledgeBaseFrame",
|
||||
["Lag"] = "HelpFrameLag",
|
||||
};
|
||||
-- openFrame is the current help frame that a player has opened.
|
||||
local openFrame;
|
||||
-- frameStack is a stack of all the help frames that a player has opened.
|
||||
-- For example, if I open the knowledge base, then open the stuck frame, then open the open ticket frame,
|
||||
-- frameStack would look like this:
|
||||
--
|
||||
-- frameStack: bottom [ KnowledgeBaseFrame, HelpFrameStuck ] top
|
||||
-- openFrame: HelpFrameOpenTicket
|
||||
--
|
||||
-- For usage, see:
|
||||
-- HelpFrame_ShowFrame(key)
|
||||
-- HelpFrame_PopFrame()
|
||||
-- HelpFrame_PopAllFrames()
|
||||
local frameStack = { };
|
||||
|
||||
local refreshTime;
|
||||
local ticketQueueActive = true;
|
||||
|
||||
local haveTicket = false; -- true if the server tells us we have an open ticket
|
||||
local haveResponse = false; -- true if we got a GM response to a previous ticket
|
||||
local needResponse = true; -- true if we want a GM to contact us when we open a new ticket
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrame
|
||||
--
|
||||
|
||||
function HelpFrame_OnLoad(self)
|
||||
self:RegisterEvent("PLAYER_ENTERING_WORLD");
|
||||
self:RegisterEvent("UPDATE_GM_STATUS");
|
||||
self:RegisterEvent("UPDATE_TICKET");
|
||||
self:RegisterEvent("GMSURVEY_DISPLAY");
|
||||
self:RegisterEvent("GMRESPONSE_RECEIVED");
|
||||
end
|
||||
|
||||
function HelpFrame_OnShow(self)
|
||||
UpdateMicroButtons();
|
||||
PlaySound("igCharacterInfoOpen");
|
||||
GetGMStatus();
|
||||
end
|
||||
|
||||
function HelpFrame_OnHide(self)
|
||||
PlaySound("igCharacterInfoClose");
|
||||
UpdateMicroButtons();
|
||||
if ( openFrame ) then
|
||||
openFrame:Hide();
|
||||
openFrame = nil;
|
||||
end
|
||||
HelpFrame_PopAllFrames();
|
||||
end
|
||||
|
||||
function HelpFrame_OnEvent(self, event, ...)
|
||||
if ( event == "PLAYER_ENTERING_WORLD" ) then
|
||||
GetGMTicket();
|
||||
elseif ( event == "UPDATE_GM_STATUS" ) then
|
||||
local status = ...;
|
||||
if ( status == GMTICKET_QUEUE_STATUS_ENABLED ) then
|
||||
ticketQueueActive = true;
|
||||
else
|
||||
ticketQueueActive = false;
|
||||
HelpFrameStuckOpenTicket:Disable();
|
||||
if ( status == GMTICKET_QUEUE_STATUS_DISABLED ) then
|
||||
StaticPopup_Show("HELP_TICKET_QUEUE_DISABLED");
|
||||
end
|
||||
end
|
||||
elseif ( event == "GMSURVEY_DISPLAY" ) then
|
||||
-- If there's a survey to display then fill out info and return
|
||||
TicketStatusTitleText:SetText(CHOSEN_FOR_GMSURVEY);
|
||||
TicketStatusTime:Hide();
|
||||
TicketStatusFrame:SetHeight(TicketStatusTitleText:GetHeight() + 20);
|
||||
TicketStatusFrame:Show();
|
||||
TicketStatusFrame.hasGMSurvey = true;
|
||||
haveResponse = false;
|
||||
haveTicket = false;
|
||||
UIFrameFlash(TicketStatusFrameIcon, 0.75, 0.75, 20);
|
||||
elseif ( event == "UPDATE_TICKET" ) then
|
||||
local category, ticketDescription, ticketAge, oldestTicketTime, updateTime, assignedToGM, openedByGM = ...;
|
||||
-- If there are args then the player has a ticket
|
||||
if ( category ) then
|
||||
-- Has an open ticket
|
||||
TicketStatusTitleText:SetText(TICKET_STATUS);
|
||||
TicketStatusFrame.hasGMSurvey = false;
|
||||
HelpFrameOpenTicketEditBox:SetText(ticketDescription);
|
||||
-- Setup estimated wait time
|
||||
--[[
|
||||
ticketAge - days
|
||||
oldestTicketTime - days
|
||||
updateTime - days
|
||||
How recent is the data for oldest ticket time, measured in days. If this number 1 hour, we have bad data.
|
||||
assignedToGM - see GMTICKET_ASSIGNEDTOGM_STATUS_* constants
|
||||
openedByGM - see GMTICKET_OPENEDBYGM_STATUS_* constants
|
||||
]]
|
||||
local statusText;
|
||||
TicketStatusFrame.ticketTimer = nil;
|
||||
if ( openedByGM == GMTICKET_OPENEDBYGM_STATUS_OPENED ) then
|
||||
-- if ticket has been opened by a gm
|
||||
if ( assignedToGM == GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED ) then
|
||||
statusText = GM_TICKET_ESCALATED;
|
||||
else
|
||||
statusText = GM_TICKET_SERVICE_SOON;
|
||||
end
|
||||
else
|
||||
-- convert from days to seconds
|
||||
local estimatedWaitTime = (oldestTicketTime - ticketAge) * 24 * 60 * 60;
|
||||
if ( estimatedWaitTime < 0 ) then
|
||||
estimatedWaitTime = 0;
|
||||
end
|
||||
|
||||
if ( oldestTicketTime < 0 or updateTime < 0 or updateTime > 0.042 ) then
|
||||
statusText = GM_TICKET_UNAVAILABLE;
|
||||
elseif ( estimatedWaitTime > 7200 ) then
|
||||
-- if wait is over 2 hrs
|
||||
statusText = GM_TICKET_HIGH_VOLUME;
|
||||
elseif ( estimatedWaitTime > 300 ) then
|
||||
-- if wait is over 5 mins
|
||||
statusText = format(GM_TICKET_WAIT_TIME, SecondsToTime(estimatedWaitTime, 1));
|
||||
TicketStatusFrame.ticketTimer = estimatedWaitTime;
|
||||
else
|
||||
statusText = GM_TICKET_SERVICE_SOON;
|
||||
end
|
||||
end
|
||||
if ( statusText ) then
|
||||
TicketStatusTime:Show();
|
||||
TicketStatusTime:SetText(statusText);
|
||||
end
|
||||
|
||||
haveResponse = false;
|
||||
haveTicket = true;
|
||||
HelpFrameOpenTicketSubmit:SetText(EDIT_TICKET);
|
||||
HelpFrameOpenTicketLabel:SetText(HELPFRAME_OPENTICKET_EDITTEXT);
|
||||
|
||||
-- hide the buttons that open a ticket and show the buttons that edit a ticket
|
||||
KnowledgeBaseFrameGMTalk:Hide();
|
||||
KnowledgeBaseFrameReportIssue:Hide();
|
||||
HelpFrameStuckOpenTicket:Hide();
|
||||
KnowledgeBaseFrameEditTicket:Show();
|
||||
KnowledgeBaseFrameAbandonTicket:Show();
|
||||
else
|
||||
-- the player does not have a ticket
|
||||
HelpFrameOpenTicketEditBox:SetText("");
|
||||
haveResponse = false;
|
||||
haveTicket = false;
|
||||
HelpFrameOpenTicketSubmit:SetText(SUBMIT);
|
||||
HelpFrameOpenTicketLabel:SetText(HELPFRAME_OPENTICKET_TEXT);
|
||||
|
||||
-- hide the buttons that edit a ticket and show the buttons that open a ticket
|
||||
KnowledgeBaseFrameGMTalk:Show();
|
||||
KnowledgeBaseFrameReportIssue:Show();
|
||||
HelpFrameStuckOpenTicket:Show();
|
||||
KnowledgeBaseFrameEditTicket:Hide();
|
||||
KnowledgeBaseFrameAbandonTicket:Hide();
|
||||
end
|
||||
elseif ( event == "GMRESPONSE_RECEIVED" ) then
|
||||
local ticketDescription, response = ...;
|
||||
|
||||
haveResponse = true;
|
||||
-- i know this is a little confusing since you can have a ticket while you have a response, but having a response
|
||||
-- basically implies that you can't make a *new* ticket until you deal with the response...maybe it should be
|
||||
-- called haveNewTicket but that would probably be even more confusing
|
||||
haveTicket = false;
|
||||
|
||||
TicketStatusTitleText:SetText(GM_RESPONSE_ALERT);
|
||||
TicketStatusTime:SetText("");
|
||||
TicketStatusTime:Hide();
|
||||
TicketStatusFrame.hasGMSurvey = false;
|
||||
|
||||
local descriptionSuffix = "\n";
|
||||
HelpFrameViewResponseIssueBody:SetText(ticketDescription..descriptionSuffix);
|
||||
local responseSuffix = "\n";
|
||||
HelpFrameViewResponseMessageBody:SetText(response..responseSuffix);
|
||||
|
||||
-- clear out the open ticket edit box...the original design called for filling in the edit box with the ticketDescription in case
|
||||
-- the player wanted to create a follow-up ticket, but creating a new ticket with your old ticket's text felt strange so I opted
|
||||
-- to just clear out the text instead
|
||||
HelpFrameOpenTicketEditBox:SetText("");
|
||||
HelpFrameOpenTicketSubmit:SetText(SUBMIT);
|
||||
HelpFrameOpenTicketLabel:SetText(HELPFRAME_OPENTICKET_FOLLOWUPTEXT);
|
||||
|
||||
-- hide the buttons that edit a ticket and show the buttons that open a ticket
|
||||
-- the player shouldn't be able to edit or open a ticket while a response is up, but they will at least be able to view
|
||||
-- the information on the various help pages this way
|
||||
KnowledgeBaseFrameGMTalk:Show();
|
||||
KnowledgeBaseFrameReportIssue:Show();
|
||||
HelpFrameStuckOpenTicket:Show();
|
||||
KnowledgeBaseFrameEditTicket:Hide();
|
||||
KnowledgeBaseFrameAbandonTicket:Hide();
|
||||
end
|
||||
end
|
||||
|
||||
function HelpFrame_ShowFrame(key)
|
||||
local frameName = helpFrames[key];
|
||||
local frame = _G[frameName];
|
||||
if ( not frame ) then
|
||||
return;
|
||||
end
|
||||
|
||||
-- Close previously opened frame
|
||||
if ( openFrame ) then
|
||||
if ( frame == openFrame ) then
|
||||
-- the requested frame is the same as the open frame...do nothing
|
||||
return;
|
||||
end
|
||||
openFrame:Hide();
|
||||
tinsert(frameStack, openFrame);
|
||||
end
|
||||
|
||||
if ( key == "OpenTicket" ) then
|
||||
if ( not HelpFrame_IsGMTicketQueueActive() ) then
|
||||
-- Petition queue is down and we're trying to go to the OpenTicket frame, show a dialog instead
|
||||
HideUIPanel(HelpFrame);
|
||||
StaticPopup_Show("HELP_TICKET_QUEUE_DISABLED");
|
||||
return;
|
||||
end
|
||||
if ( haveResponse ) then
|
||||
-- if we have a response that hasn't been dealt with and the player is trying to open a new ticket,
|
||||
-- give them a warning dialog instead
|
||||
HideUIPanel(HelpFrame);
|
||||
StaticPopup_Show("GM_RESPONSE_MUST_RESOLVE_RESPONSE");
|
||||
return;
|
||||
end
|
||||
end
|
||||
|
||||
ShowUIPanel(HelpFrame);
|
||||
frame:Show();
|
||||
openFrame = frame;
|
||||
end
|
||||
|
||||
function HelpFrame_PopFrame()
|
||||
if ( not openFrame) then
|
||||
return;
|
||||
end
|
||||
openFrame:Hide();
|
||||
local top = tremove(frameStack);
|
||||
if ( not top ) then
|
||||
HideUIPanel(HelpFrame);
|
||||
return;
|
||||
end
|
||||
top:Show();
|
||||
openFrame = top;
|
||||
end
|
||||
|
||||
function HelpFrame_PopAllFrames()
|
||||
while #frameStack > 0 do
|
||||
tremove(frameStack);
|
||||
end
|
||||
end
|
||||
|
||||
function HelpFrame_IsGMTicketQueueActive()
|
||||
return ticketQueueActive;
|
||||
end
|
||||
|
||||
function HelpFrame_HaveGMTicket()
|
||||
return haveTicket;
|
||||
end
|
||||
|
||||
function HelpFrame_HaveGMResponse()
|
||||
return haveResponse;
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameGMTalk
|
||||
--
|
||||
|
||||
function HelpFrameGMTalk_OnShow(self)
|
||||
needResponse = true;
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameReportIssue
|
||||
--
|
||||
|
||||
function HelpFrameReportIssue_OnShow(self)
|
||||
needResponse = false;
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameStuck
|
||||
--
|
||||
|
||||
function HelpFrameStuck_OnShow(self)
|
||||
needResponse = true;
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameOpenTicket
|
||||
--
|
||||
|
||||
function HelpFrameOpenTicketCancel_OnClick()
|
||||
GetGMTicket();
|
||||
HelpFrame_PopFrame();
|
||||
end
|
||||
|
||||
function HelpFrameOpenTicketSubmit_OnClick()
|
||||
if ( haveResponse ) then
|
||||
GMResponseNeedMoreHelp(HelpFrameOpenTicketEditBox:GetText());
|
||||
else
|
||||
if ( haveTicket ) then
|
||||
UpdateGMTicket(HelpFrameOpenTicketEditBox:GetText());
|
||||
else
|
||||
NewGMTicket(HelpFrameOpenTicketEditBox:GetText(), needResponse);
|
||||
end
|
||||
end
|
||||
HideUIPanel(HelpFrame);
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameViewResponseButton
|
||||
--
|
||||
|
||||
function HelpFrameViewResponseButton_OnLoad(self)
|
||||
local width = self:GetWidth() - 20;
|
||||
local deltaWidth = self:GetTextWidth() - width;
|
||||
if ( deltaWidth > 0 ) then
|
||||
self:SetWidth(width + deltaWidth + 40);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameViewResponseMoreHelp
|
||||
--
|
||||
|
||||
function HelpFrameViewResponseMoreHelp_OnClick(self)
|
||||
StaticPopup_Show("GM_RESPONSE_NEED_MORE_HELP");
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- HelpFrameViewResponseIssueResolved
|
||||
--
|
||||
|
||||
function HelpFrameViewResponseIssueResolved_OnClick(self)
|
||||
StaticPopup_Show("GM_RESPONSE_RESOLVE_CONFIRM");
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- TicketStatusFrame
|
||||
--
|
||||
|
||||
function TicketStatusFrame_OnLoad(self)
|
||||
self:RegisterEvent("UPDATE_TICKET");
|
||||
self:RegisterEvent("GMRESPONSE_RECEIVED");
|
||||
end
|
||||
|
||||
function TicketStatusFrame_OnEvent(self, event, ...)
|
||||
if ( event == "UPDATE_TICKET" ) then
|
||||
local category = ...;
|
||||
if ( (category or self.hasGMSurvey) and (not GMChatStatusFrame or not GMChatStatusFrame:IsShown()) ) then
|
||||
self:Show();
|
||||
refreshTime = GMTICKET_CHECK_INTERVAL;
|
||||
else
|
||||
self:Hide();
|
||||
end
|
||||
elseif ( event == "GMRESPONSE_RECEIVED" ) then
|
||||
if ( not GMChatStatusFrame or not GMChatStatusFrame:IsShown() ) then
|
||||
self:Show();
|
||||
else
|
||||
self:Hide();
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function TicketStatusFrame_OnUpdate(self, elapsed)
|
||||
if ( haveTicket ) then
|
||||
-- Every so often, query the server for our ticket status
|
||||
if ( refreshTime ) then
|
||||
refreshTime = refreshTime - elapsed;
|
||||
if ( refreshTime <= 0 ) then
|
||||
refreshTime = GMTICKET_CHECK_INTERVAL;
|
||||
GetGMTicket();
|
||||
end
|
||||
end
|
||||
if ( self.ticketTimer ) then
|
||||
self.ticketTimer = self.ticketTimer - elapsed;
|
||||
TicketStatusTime:SetFormattedText(GM_TICKET_WAIT_TIME, SecondsToTime(self.ticketTimer, 1));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function TicketStatusFrame_OnShow(self)
|
||||
ConsolidatedBuffs:SetPoint("TOPRIGHT", self:GetParent(), "TOPRIGHT", -205, (-self:GetHeight()));
|
||||
end
|
||||
|
||||
function TicketStatusFrame_OnHide(self)
|
||||
if( not GMChatStatusFrame or not GMChatStatusFrame:IsShown() ) then
|
||||
ConsolidatedBuffs:SetPoint("TOPRIGHT", "UIParent", "TOPRIGHT", -180, -13);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- TicketStatusFrameButton
|
||||
--
|
||||
|
||||
function TicketStatusFrameButton_OnLoad(self)
|
||||
self:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r, TOOLTIP_DEFAULT_COLOR.g, TOOLTIP_DEFAULT_COLOR.b);
|
||||
self:SetBackdropColor(TOOLTIP_DEFAULT_BACKGROUND_COLOR.r, TOOLTIP_DEFAULT_BACKGROUND_COLOR.g, TOOLTIP_DEFAULT_BACKGROUND_COLOR.b);
|
||||
|
||||
-- make sure this frame doesn't cover up the content in the parent
|
||||
self:SetFrameLevel(self:GetParent():GetFrameLevel() - 1);
|
||||
end
|
||||
|
||||
function TicketStatusFrameButton_OnClick(self)
|
||||
if ( TicketStatusFrame.hasGMSurvey ) then
|
||||
GMSurveyFrame_LoadUI();
|
||||
ShowUIPanel(GMSurveyFrame);
|
||||
TicketStatusFrame:Hide();
|
||||
elseif ( StaticPopup_Visible("HELP_TICKET_ABANDON_CONFIRM") ) then
|
||||
StaticPopup_Hide("HELP_TICKET_ABANDON_CONFIRM");
|
||||
elseif ( StaticPopup_Visible("HELP_TICKET") ) then
|
||||
StaticPopup_Hide("HELP_TICKET");
|
||||
elseif ( StaticPopup_Visible("GM_RESPONSE_NEED_MORE_HELP") ) then
|
||||
StaticPopup_Hide("GM_RESPONSE_NEED_MORE_HELP");
|
||||
elseif ( StaticPopup_Visible("GM_RESPONSE_RESOLVE_CONFIRM") ) then
|
||||
StaticPopup_Hide("GM_RESPONSE_RESOLVE_CONFIRM");
|
||||
elseif ( StaticPopup_Visible("GM_RESPONSE_CANT_OPEN_TICKET") ) then
|
||||
StaticPopup_Hide("GM_RESPONSE_CANT_OPEN_TICKET");
|
||||
elseif ( not HelpFrame:IsShown() and not KnowledgeBaseFrame:IsShown() ) then
|
||||
if ( haveResponse ) then
|
||||
HelpFrame_ShowFrame("GMResponse");
|
||||
elseif ( haveTicket ) then
|
||||
StaticPopup_Show("HELP_TICKET");
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function HelpReportLag(kind)
|
||||
HideUIPanel(HelpFrame);
|
||||
GMReportLag(STATIC_CONSTANTS[kind]);
|
||||
StaticPopup_Show("LAG_SUCCESS");
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user