From 519216715311c62f7ac7a9833eb015a66e1e5404 Mon Sep 17 00:00:00 2001 From: Linventif Date: Wed, 14 Aug 2024 16:28:10 +0000 Subject: [PATCH] add: report bug --- .../client/cl_context_menu.lua | 12 ++ lua/gmod_integration/client/cl_report_bug.lua | 147 ++++++++++++++++++ .../gmod_integration/logo_context_report.png | Bin 0 -> 7437 bytes 3 files changed, 159 insertions(+) create mode 100644 lua/gmod_integration/client/cl_report_bug.lua create mode 100644 materials/gmod_integration/logo_context_report.png diff --git a/lua/gmod_integration/client/cl_context_menu.lua b/lua/gmod_integration/client/cl_context_menu.lua index f08fce5..434a8c5 100644 --- a/lua/gmod_integration/client/cl_context_menu.lua +++ b/lua/gmod_integration/client/cl_context_menu.lua @@ -8,4 +8,16 @@ list.Set("DesktopWindows", "GmodIntegration:DesktopWindows", { window:Close() gmInte.openAdminConfig() end +}) + +list.Set("DesktopWindows", "GmodIntegration:DesktopWindows:ReportBug", { + icon = "gmod_integration/logo_context_report.png", + title = "Report Bug", + width = 960, + height = 700, + onewindow = true, + init = function(icon, window) + window:Close() + gmInte.openReportBug() + end }) \ No newline at end of file diff --git a/lua/gmod_integration/client/cl_report_bug.lua b/lua/gmod_integration/client/cl_report_bug.lua new file mode 100644 index 0000000..74dfd89 --- /dev/null +++ b/lua/gmod_integration/client/cl_report_bug.lua @@ -0,0 +1,147 @@ +// format: multiline +local Fields = { + { + ["title"] = "Screenshot", + ["type"] = "image", + }, + { + ["title"] = "Description", + ["type"] = "text", + ["tall"] = 80, + }, + { + ["title"] = "Importance Level", + ["type"] = "dropdown", + ["options"] = { + "Critical - Crash or made the game unplayable.", + "High - Critical functionality is unusable.", + "Medium - Important functionality is unusable.", + "Low - Cosmetic issue.", + "Trivial - Very minor issue.", + }, + }, + { + ["title"] = "Steps to Reproduce", + ["type"] = "text", + ["tall"] = 80, + }, + { + ["title"] = "Expected result", + ["type"] = "text", + ["tall"] = 50, + }, + { + ["title"] = "Actual result", + ["type"] = "text", + ["tall"] = 50, + }, +} + +function gmInte.openReportBug() + local captureData = { + format = "jpeg", + x = 0, + y = 0, + w = ScrW(), + h = ScrH(), + quality = 95, + } + + local screenCapture = render.Capture(captureData) + if screenCapture then file.Write("gmod_integration/report_bug_screenshot.jpeg", screenCapture) end + local frame = vgui.Create("DFrame") + frame:SetSize(500, (700 / 1080) * ScrH()) + frame:Center() + frame:SetTitle("Report Bug") + frame:MakePopup() + gmInte.applyPaint(frame) + // bug report = screenshot, description, steps to reproduce, expected result, actual result + local dPanel = vgui.Create("DScrollPanel", frame) + dPanel:Dock(FILL) + gmInte.applyPaint(dPanel) + local elements = {} + for _ = 1, #Fields do + local field = Fields[_] + if field.type == "image" && !screenCapture then continue end + local label = vgui.Create("DLabel", dPanel) + label:Dock(TOP) + label:DockMargin(5, 5, 5, 5) + label:SetText(field.title) + if field.type == "image" then + local image = vgui.Create("DImage", dPanel) + image:Dock(TOP) + image:DockMargin(5, 5, 5, 5) + image:SetImage("data/gmod_integration/report_bug_screenshot.jpeg") + image:SetSize(frame:GetWide() - 10, (frame:GetWide() - 10) * (9 / 16)) + elseif field.type == "text" then + local text = vgui.Create("DTextEntry", dPanel) + text:Dock(TOP) + text:DockMargin(5, 5, 5, 5) + text:SetMultiline(true) + text:SetTall(field.tall || 40) + text:SetPlaceholderText("Explain the bug you encountered, be as precise as possible.") + gmInte.applyPaint(text) + table.insert(elements, text) + elseif field.type == "dropdown" then + local dropdown = vgui.Create("DComboBox", dPanel) + dropdown:Dock(TOP) + dropdown:DockMargin(5, 5, 5, 5) + dropdown:SetValue("Select Importance Level") + for i = 1, #field.options do + dropdown:AddChoice(field.options[i]) + end + + dropdown:SetSortItems(false) + gmInte.applyPaint(dropdown) + table.insert(elements, dropdown) + end + end + + local buttonGrid = vgui.Create("DGrid", frame) + buttonGrid:Dock(BOTTOM) + buttonGrid:DockMargin(5, 10, 5, 5) + buttonGrid:SetCols(2) + buttonGrid:SetColWide(frame:GetWide() - 10) + buttonGrid:SetRowHeight(35) + local button = vgui.Create("DButton") + button:SetText("Send Report") + button:SetSize(buttonGrid:GetColWide() - 10, buttonGrid:GetRowHeight()) + gmInte.applyPaint(button) + buttonGrid:AddItem(button) + button.DoClick = function() + // all fields are required and > 60 characters + for _, element in ipairs(elements) do + if element:GetText() == "" then + notification.AddLegacy("All fields are required", NOTIFY_ERROR, 5) + return + end + end + + local screenData = {} + if screenCapture then + local base64Capture = util.Base64Encode(screenCapture) + local size = math.Round(string.len(base64Capture) / 1024) + screenData = { + ["screenshot"] = base64Capture, + ["captureData"] = captureData, + ["size"] = size .. "KB" + } + end + + gmInte.http.post("/clients/:steamID64/servers/:serverID/bugs", { + ["player"] = gmInte.getPlayerFormat(LocalPlayer()), + ["screenshot"] = screenData, + ["description"] = elements[1]:GetText(), + ["importance"] = elements[2]:GetValue(), + ["steps"] = elements[3]:GetText(), + ["expected"] = elements[4]:GetText(), + ["actual"] = elements[5]:GetText(), + }, function() + notification.AddLegacy("Bug report sent to Discord", NOTIFY_GENERIC, 5) + frame:Close() + end, function() notification.AddLegacy("Failed to send bug report retry later", NOTIFY_ERROR, 5) end) + end +end + +concommand.Add("gmi_report_bug", gmInte.openReportBug) +concommand.Add("gmod_integration_report_bug", gmInte.openReportBug) \ No newline at end of file diff --git a/materials/gmod_integration/logo_context_report.png b/materials/gmod_integration/logo_context_report.png new file mode 100644 index 0000000000000000000000000000000000000000..c4cdfba44d529a5835bab387fc43e1dfc1b5da2a GIT binary patch literal 7437 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

)(CE{& zn3Dc!*Ug(YeV84JGwLHC7e9u)n*VUki5eaL71i%Xmtul0Z%8Kxa3?v*SD_vx5 zWu;+lVIkk!HL$R7vt{l`)AW4*Z&$8l+?5>~A0M9q=aDs00SBJGop{a%hc~Twtl&6UT(=ZxcYDrQ%4tj1hh8JXZv6{WE<515 zumNkQr}q?p`LrU;e{l5f$ohek1|{3<-9L%89x`@6ek|5ec+Vl5S(z3YACCAh(I46D literal 0 HcmV?d00001