You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
9.2 KiB

local unpack, select, pairs, type, tostring =
unpack, select, pairs, type, tostring
local GetLocale, UnitClass, UnitRace, GetAddOnMetadata, UnitLevel, GetSpecializationInfo, GetSpecialization =
GetLocale, UnitClass, UnitRace, GetAddOnMetadata, UnitLevel, GetSpecializationInfo, GetSpecialization
local BestInSlot, L, AceGUI = unpack(select(2, ...))
local Reporting = BestInSlot:GetMenuPrototype(L["Bugs and recommendations"])
Reporting.Width = 700
Reporting.Height = 600
local reportTypes ={
BUG = HELPFRAME_REPORT_BUG_TITLE,
MISSINGITEM = L["Submit Missing item"],
SUGGESTION = HELPFRAME_SUBMIT_SUGGESTION_TITLE
}
function Reporting:Close()
self.panel = nil
self.bug = nil
self.bug_error = nil
self.missing_itemid = nil
self.missing_instance = nil
self.missing_slot = nil
self.missing_additional = nil
self.suggestion = nil
end
function Reporting:CreateReport(reportType, text)
local window = self:QuickCreate("Window")
window:AddChild(self:CreateUneditableTextbox("https://github.com/anhility/BestInSlotRedux/issues/", L["Please navigate to the issue tracker."] .. " " .. (L["Please select the type: %s"]):format(reportType)))
--self:QuickCreate("Label", {SetText = (L["Please select the type: %s"]):format(reportType)}, window)
local editbox = self:CreateUneditableTextbox(text, L["Copy paste underlying information in the description field."], "MultiLineEditBox")
editbox:SetNumLines(20)
window:AddChild(editbox)
end
local function onButtonClick(btn)
local type = btn:GetUserData("type")
local panel = Reporting.panel
if panel then panel:ReleaseChildren() end
if type == "BUG" then
Reporting:DrawBugSection(panel)
elseif type == "MISSINGITEM" then
Reporting:DrawMissingItemSection(panel)
elseif type == "SUGGESTION" then
Reporting:DrawSuggestionSection(panel)
end
end
local function renderBugSectionDump()
local bug = Reporting.bug:GetText()
local error = Reporting.bug_error:GetText()
local selected = Reporting:GetSelected()
local stringifiedDB = ""
local args = {
bug, --1 The report
select(2, UnitClass("player")), --2 the class of the player
select(2, UnitRace("player")), --3 the race of the player
GetLocale(), --4 the locale of the player
GetAddOnMetadata("BestInSlotRedux", "Version"), --5 the version the player is using
Reporting:GetActiveModules(), --6 the active modules
GetSpecializationInfo(GetSpecialization()), --7 Active specialization
selected.expansion, -- 8 Selected expansion
selected.raidtier, -- 9 Selected raid tier
selected.instance, -- 10 Selected instance
selected.difficulty, --11 Selected difficulty
selected.specialization, --12 Selected specialization
Reporting:GetCustomItems(), --13 the custom items
UnitLevel("player"), --14 The player level,
Reporting:GetPlayerOptions(), -- 15 the player options
error, --16 the LUA error pasted by the user
Reporting:GetConsoleErrors(), --17 the console errors
}
for i=1,#args do
args[i] = tostring(args[i])
end
Reporting:CreateReport("Defect",
([[Bug Report:
Description
%1$s
Player class:
%2$s
Player race:
%3$s
Player level:
%14$s
Player specialization
%7$s
Player locale:
%4$s
BestInSlot Version:
%5$s
BestInSlot Selected information:
Expansion: %8$s
Raid Tier: %9$s
Instance: %10$s
Difficulty: %11$s
Specialization: %12$s
Active modules:
%6$s
Custom items:
%13$s
Character options:
%15$s
Console errors:
%17$s
LUA error:
%16$s
]]):format(unpack(args)))
end
function Reporting:DrawBugSection(panel)
self.bug = self:QuickCreate("MultiLineEditBox", {SetNumLines = 10, SetLabel = L["Describe what you were doing when the bug occured"], SetFullWidth = true}, panel)
self.bug_error = self:QuickCreate("MultiLineEditBox", {SetNumLines = 10, SetLabel = L["Paste any LUA errors in this field"], SetFullWidth = true}, panel)
self:QuickCreate("Button", {SetFullWidth = true, SetText = SUBMIT, SetCallback = {"OnClick", renderBugSectionDump}}, panel)
end
function Reporting:GetActiveModules()
local modules = ""
for k, v in pairs(BestInSlot.modules) do
modules = ("%s- %s (%s)\r\n"):format(modules, k, v:IsEnabled() and "Loaded" or "Not loaded")
end
return modules
end
function Reporting:GetCustomItems()
local customItems = ""
local count = 0
for dung, list in pairs(BestInSlot:GetCustomItems()) do
count = count + #list
for i=1,#list do
if i == 1 then
customItems = ("%s%s\r\n"):format(customItems, dung)
end
customItems = ("%s%s\r\n"):format(customItems, tostring(list[i]))
end
end
return count > 0 and customItems or "No custom items"
end
local formats
formats = {
string = function(str) return ("\"%s\""):format(str) end,
number = function(str) return ("%d"):format(str) end,
table = function(tbl, depth)
local str = "{\r\n"
depth = depth or 0
local indent = (depth + 1) * 2
for k, v in pairs(tbl) do
str = ("%s%s[%s] = %s,\r\n"):format(str,(" "):rep(indent), k, formats[type(v)](v, depth + 1))
end
return str .. (" "):rep(depth * 2) .. "}"
end,
["nil"] = function() return "nil" end,
["function"] = function(str) return tostring(str) end,
boolean = function(bool) return tostring(bool) end,
userdata = function(ud) return tostring(ud) end
}
function Reporting:GetPlayerOptions()
return formats.table(BestInSlot.db.char.options)
end
function Reporting:GetConsoleErrors()
local errors = self.console:GetErrors()
if #errors == 0 then
return "There are no errors"
else
local str = ""
for i=1,#errors do
local error = errors[i]
str = ("%sError %d: %s\r\n"):format(str, i, error.descr)
for j=1,#error.param do
local param = error.param[j]
str = ("%s Parameter %d:%s\r\n"):format(str, j, formats[type(param)](param, 2))
end
end
return str
end
end
local function renderMissingSectionDump()
local itemid = Reporting.missing_itemid:GetText()
local instance = Reporting.missing_instance:GetText()
local slot = Reporting.missing_slot:GetText()
local additional = Reporting.missing_additional:GetText()
Reporting:CreateReport("Patch",
([[Missing Item Report
ItemID:
%s
Dungeon Information:
%s
Slot and information:
%s
Additional Information:
%s]]):format(itemid, instance, slot, additional))
end
function Reporting:DrawMissingItemSection(panel)
self.missing_itemid = self:QuickCreate("EditBox", {SetLabel = L["What is the item ID for the item you miss in BestInSlot?"], SetFullWidth = true}, panel)
self.missing_instance = self:QuickCreate("EditBox", {SetLabel = L["Should this item be added to an instance? If so which one, and which boss."], SetFullWidth = true}, panel)
self.missing_slot = self:QuickCreate("EditBox", {SetLabel = L["Is the item missing for a particular class or slot? If so, which one."], SetFullWidth = true}, panel)
self.missing_additional = self:QuickCreate("MultiLineEditBox", {SetNumLines = 10, SetLabel = L["Additional Information"], SetFullWidth = true}, panel)
self:QuickCreate("Button", {SetFullWidth = true, SetText = SUBMIT, SetCallback = {"OnClick", renderMissingSectionDump}}, panel)
end
local function renderSuggestionSectionDump()
local suggestion = Reporting.suggestion:GetText()
Reporting:CreateReport("Enhancement",
([[Suggestion Report:
%s
]]):format(suggestion))
end
function Reporting:DrawSuggestionSection(panel)
self.suggestion = self:QuickCreate("MultiLineEditBox", {SetNumLines = 10, SetLabel = L["Describe what you would like to see implemented"], SetFullWidth = true}, panel)
self:QuickCreate("Button", {SetFullWidth = true, SetText = SUBMIT, SetCallback = {"OnClick", renderSuggestionSectionDump}}, panel)
end
function Reporting:Draw(container)
local settings = {
SetFullWidth = true,
SetCallback = {"OnClick", onButtonClick},
SetUserData = {"type"}
}
container:AddChild(self:QuickCreate("Heading",{SetText = L["Bugs and recommendations"] , SetFullWidth = true, SetCallback = {"OnClick", }}))
for k,v in pairs(reportTypes) do
settings.SetText = v
settings.SetUserData[2] = k
container:AddChild(self:QuickCreate("Button", settings))
end
local group = self:QuickCreate("SimpleGroup", {SetFullWidth = true})
self:QuickCreate("Label", {SetText = L["Please choose what you would like to submit"] , SetFullWidth = true}, group)
container:AddChild(group)
self.panel = group
end
local function onSlashCommand()
--we assume that when users use this way of getting to the frame, they can't access the main frame, so we make a new one
local frame = AceGUI:Create("Frame")
frame:SetWidth(Reporting.Width)
frame.frame:SetFrameStrata("HIGH")
frame:SetHeight(Reporting.Height)
frame:SetCallback("OnClose", function(widget) widget.frame:SetFrameStrata("FULLSCREEN_DIALOG") widget:Release() end)
frame:SetTitle("BestInSlot " .. L["Bugs and recommendations"])
frame:SetStatusText(L["This window is intended for when the normal BestInSlot window won't open!"])
frame:EnableResize(false)
Reporting:Draw(frame)
end
BestInSlot:RegisterSlashCmd("bug", (L["%s - Shows the report bug window"]):format("/bis bug"), onSlashCommand)