Merge branch 'master' into profiles

This commit is contained in:
goat 2023-04-11 21:33:19 +02:00
commit 9b3990e5c7
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
4 changed files with 46 additions and 40 deletions

View file

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Feature"> <PropertyGroup Label="Feature">
<DalamudVersion>7.5.0.1</DalamudVersion> <DalamudVersion>7.5.0.2</DalamudVersion>
<Description>XIV Launcher addon framework</Description> <Description>XIV Launcher addon framework</Description>
<AssemblyVersion>$(DalamudVersion)</AssemblyVersion> <AssemblyVersion>$(DalamudVersion)</AssemblyVersion>
<Version>$(DalamudVersion)</Version> <Version>$(DalamudVersion)</Version>

View file

@ -8,6 +8,7 @@ using System.Threading.Tasks;
using Dalamud.Configuration.Internal; using Dalamud.Configuration.Internal;
using Dalamud.Logging.Internal; using Dalamud.Logging.Internal;
using Dalamud.Plugin.Internal;
using Dalamud.Support; using Dalamud.Support;
using Dalamud.Utility; using Dalamud.Utility;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -325,10 +326,29 @@ public sealed class EntryPoint
info = $"{ex.TargetSite.DeclaringType.Assembly.GetName().Name}, {ex.TargetSite.DeclaringType.FullName}::{ex.TargetSite.Name}"; info = $"{ex.TargetSite.DeclaringType.Assembly.GetName().Name}, {ex.TargetSite.DeclaringType.FullName}::{ex.TargetSite.Name}";
} }
var pluginInfo = string.Empty;
var supportText = ", please visit us on Discord for more help.";
try
{
var pm = Service<PluginManager>.GetNullable();
var plugin = pm?.FindCallingPlugin(new StackTrace(ex));
if (plugin != null)
{
pluginInfo = $"Plugin that caused this:\n{plugin.Name}\n\nClick \"Yes\" and remove it.\n\n";
if (plugin.Manifest.IsThirdParty)
supportText = string.Empty;
}
}
catch
{
// ignored
}
const MessageBoxType flags = NativeFunctions.MessageBoxType.YesNo | NativeFunctions.MessageBoxType.IconError | NativeFunctions.MessageBoxType.SystemModal; const MessageBoxType flags = NativeFunctions.MessageBoxType.YesNo | NativeFunctions.MessageBoxType.IconError | NativeFunctions.MessageBoxType.SystemModal;
var result = MessageBoxW( var result = MessageBoxW(
Process.GetCurrentProcess().MainWindowHandle, Process.GetCurrentProcess().MainWindowHandle,
$"An internal error in a Dalamud plugin occurred.\nThe game must close.\n\nType: {ex.GetType().Name}\n{info}\n\nMore information has been recorded separately, please contact us in our Discord or on GitHub.\n\nDo you want to disable all plugins the next time you start the game?", $"An internal error in a Dalamud plugin occurred.\nThe game must close.\n\n{ex.GetType().Name}\n{info}\n\n{pluginInfo}More information has been recorded separately{supportText}.\n\nDo you want to disable all plugins the next time you start the game?",
"Dalamud", "Dalamud",
flags); flags);

View file

@ -90,7 +90,6 @@ internal class PluginInstallerWindow : Window, IDisposable
private bool feedbackModalIncludeException = false; private bool feedbackModalIncludeException = false;
private PluginManifest? feedbackPlugin = null; private PluginManifest? feedbackPlugin = null;
private bool feedbackIsTesting = false; private bool feedbackIsTesting = false;
private bool feedbackIsAnonymous = false;
private int updatePluginCount = 0; private int updatePluginCount = 0;
private List<PluginUpdateStatus>? updatedPlugins; private List<PluginUpdateStatus>? updatedPlugins;
@ -789,23 +788,6 @@ internal class PluginInstallerWindow : Window, IDisposable
ImGui.Spacing(); ImGui.Spacing();
if (ImGui.Checkbox(Locs.FeedbackModal_ContactAnonymous, ref this.feedbackIsAnonymous))
{
if (this.feedbackIsAnonymous)
this.feedbackModalContact = string.Empty;
}
if (this.feedbackIsAnonymous)
{
ImGui.BeginDisabled();
ImGui.InputText(Locs.FeedbackModal_ContactInformation, ref this.feedbackModalContact, 0);
ImGui.EndDisabled();
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed);
ImGui.Text(Locs.FeedbackModal_ContactAnonymousWarning);
ImGui.PopStyleColor();
}
else
{
ImGui.InputText(Locs.FeedbackModal_ContactInformation, ref this.feedbackModalContact, 100); ImGui.InputText(Locs.FeedbackModal_ContactInformation, ref this.feedbackModalContact, 100);
ImGui.SameLine(); ImGui.SameLine();
@ -820,10 +802,7 @@ internal class PluginInstallerWindow : Window, IDisposable
ImGui.Text(Locs.FeedbackModal_ContactInformationHelp); ImGui.Text(Locs.FeedbackModal_ContactInformationHelp);
ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed); ImGui.TextColored(ImGuiColors.DalamudRed, Locs.FeedbackModal_ContactInformationWarning);
ImGui.Text(Locs.FeedbackModal_ContactInformationWarning);
ImGui.PopStyleColor();
}
ImGui.Spacing(); ImGui.Spacing();
@ -839,7 +818,7 @@ internal class PluginInstallerWindow : Window, IDisposable
if (ImGui.Button(Locs.ErrorModalButton_Ok, new Vector2(buttonWidth, 40))) if (ImGui.Button(Locs.ErrorModalButton_Ok, new Vector2(buttonWidth, 40)))
{ {
if (!this.feedbackIsAnonymous && string.IsNullOrWhiteSpace(this.feedbackModalContact)) if (string.IsNullOrWhiteSpace(this.feedbackModalContact))
{ {
this.ShowErrorModal(Locs.FeedbackModal_ContactInformationRequired) this.ShowErrorModal(Locs.FeedbackModal_ContactInformationRequired)
.ContinueWith(_ => .ContinueWith(_ =>
@ -905,7 +884,6 @@ internal class PluginInstallerWindow : Window, IDisposable
this.feedbackModalBody = string.Empty; this.feedbackModalBody = string.Empty;
this.feedbackModalContact = Service<DalamudConfiguration>.Get().LastFeedbackContactDetails; this.feedbackModalContact = Service<DalamudConfiguration>.Get().LastFeedbackContactDetails;
this.feedbackModalIncludeException = false; this.feedbackModalIncludeException = false;
this.feedbackIsAnonymous = false;
} }
else else
{ {
@ -3318,7 +3296,7 @@ internal class PluginInstallerWindow : Window, IDisposable
public static string FeedbackModal_ContactInformationWarning => Loc.Localize("InstallerFeedbackContactInfoWarning", "Do not submit in-game character names."); public static string FeedbackModal_ContactInformationWarning => Loc.Localize("InstallerFeedbackContactInfoWarning", "Do not submit in-game character names.");
public static string FeedbackModal_ContactInformationRequired => Loc.Localize("InstallerFeedbackContactInfoRequired", "Contact information has not been provided. If you do not want to provide contact information, tick on \"{0}\" above.").Format(FeedbackModal_ContactAnonymous); public static string FeedbackModal_ContactInformationRequired => Loc.Localize("InstallerFeedbackContactInfoRequired", "Contact information has not been provided. We require contact information to respond to questions, or to request additional information to troubleshoot problems.");
public static string FeedbackModal_ContactInformationDiscordButton => Loc.Localize("ContactInformationDiscordButton", "Join Goat Place Discord"); public static string FeedbackModal_ContactInformationDiscordButton => Loc.Localize("ContactInformationDiscordButton", "Join Goat Place Discord");

View file

@ -1300,14 +1300,14 @@ Thanks and have fun!";
} }
/// <summary> /// <summary>
/// Get the plugin that called this method by walking the stack, /// Get the plugin that called this method by walking the provided stack trace,
/// or null, if it cannot be determined. /// or null, if it cannot be determined.
/// At the time, this is naive and shouldn't be used for security-critical checks. /// At the time, this is naive and shouldn't be used for security-critical checks.
/// </summary> /// </summary>
/// <param name="trace">The trace to walk.</param>
/// <returns>The calling plugin, or null.</returns> /// <returns>The calling plugin, or null.</returns>
public LocalPlugin? FindCallingPlugin() public LocalPlugin? FindCallingPlugin(StackTrace trace)
{ {
var trace = new StackTrace();
foreach (var frame in trace.GetFrames()) foreach (var frame in trace.GetFrames())
{ {
var declaringType = frame.GetMethod()?.DeclaringType; var declaringType = frame.GetMethod()?.DeclaringType;
@ -1328,6 +1328,14 @@ Thanks and have fun!";
return null; return null;
} }
/// <summary>
/// Get the plugin that called this method by walking the stack,
/// or null, if it cannot be determined.
/// At the time, this is naive and shouldn't be used for security-critical checks.
/// </summary>
/// <returns>The calling plugin, or null.</returns>
public LocalPlugin? FindCallingPlugin() => this.FindCallingPlugin(new StackTrace());
private void DetectAvailablePluginUpdates() private void DetectAvailablePluginUpdates()
{ {
var updatablePlugins = new List<AvailablePluginUpdate>(); var updatablePlugins = new List<AvailablePluginUpdate>();