private void StartLogUpload(bool isPreviousCrashLog = false) { UploadingLog = true; TopText = M3L.GetString(M3L.string_collectingLogInformation); NamedBackgroundWorker bw = new NamedBackgroundWorker(@"LogUpload"); bw.DoWork += (a, b) => { string logUploadText = LogCollector.CollectLogs(SelectedLog.filepath); using (var output = new MemoryStream()) { var encoder = new LzmaEncodeStream(output); using (var normalBytes = new MemoryStream(Encoding.UTF8.GetBytes(logUploadText))) { int bufSize = 24576, count; var buf = new byte[bufSize]; while ((count = normalBytes.Read(buf, 0, bufSize)) > 0) { encoder.Write(buf, 0, count); } } encoder.Close(); //Upload log to ME3Tweaks var lzmalog = output.ToArray(); try { //this doesn't need to technically be async, but library doesn't have non-async method. string responseString = @"https://me3tweaks.com/modmanager/logservice/logupload.php".PostUrlEncodedAsync(new { LogData = Convert.ToBase64String(lzmalog), ModManagerVersion = App.BuildNumber, CrashLog = isPreviousCrashLog }).ReceiveString().Result; Uri uriResult; bool result = Uri.TryCreate(responseString, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); if (result) { //should be valid URL. //diagnosticsWorker.ReportProgress(0, new ThreadCommand(SET_DIAGTASK_ICON_GREEN, Image_Upload)); //e.Result = responseString; Log.Information(@"Result from server for log upload: " + responseString); b.Result = responseString; return; } else { Log.Error(@"Error uploading log. The server responded with: " + responseString); b.Result = M3L.GetString(M3L.string_interp_serverRejectedTheUpload, responseString); } } catch (AggregateException e) { Exception ex = e.InnerException; string exmessage = ex.Message; b.Result = M3L.GetString(M3L.string_interp_logWasUnableToUpload, exmessage); } catch (FlurlHttpTimeoutException) { // FlurlHttpTimeoutException derives from FlurlHttpException; catch here only // if you want to handle timeouts as a special case Log.Error(@"Request timed out while uploading log."); b.Result = M3L.GetString(M3L.string_interp_requestTimedOutUploading); } catch (Exception ex) { // ex.Message contains rich details, inclulding the URL, verb, response status, // and request and response bodies (if available) Log.Error(@"Handled error uploading log: " + App.FlattenException(ex)); string exmessage = ex.Message; var index = exmessage.IndexOf(@"Request body:"); if (index > 0) { exmessage = exmessage.Substring(0, index); } b.Result = M3L.GetString(M3L.string_interp_logWasUnableToUpload, exmessage); } } }; bw.RunWorkerCompleted += (a, b) => { if (b.Result is string response) { if (response.StartsWith(@"http")) { Utilities.OpenWebpage(response); } else { OnClosing(DataEventArgs.Empty); var res = M3L.ShowDialog(Window.GetWindow(this), response, M3L.GetString(M3L.string_logUploadFailed), MessageBoxButton.OK, MessageBoxImage.Error); return; } } OnClosing(DataEventArgs.Empty); }; bw.RunWorkerAsync(); }
private void StartLogUpload(bool isPreviousCrashLog = false) { UploadingLog = true; TopText = M3L.GetString(M3L.string_collectingLogInformation); NamedBackgroundWorker bw = new NamedBackgroundWorker(@"LogUpload"); bw.DoWork += (a, b) => { void updateStatusCallback(string status) { CollectionStatusMessage = status; } StringBuilder logUploadText = new StringBuilder(); if (SelectedDiagnosticTarget != null && SelectedDiagnosticTarget.Game > Mod.MEGame.Unknown) { Debug.WriteLine(@"Selected game target: " + SelectedDiagnosticTarget.TargetPath); logUploadText.Append("[MODE]diagnostics\n"); logUploadText.Append(LogCollector.PerformDiagnostic(SelectedDiagnosticTarget, TextureCheck /*&& SelectedDiagnosticTarget.TextureModded*/, updateStatusCallback)); logUploadText.Append("\n"); } if (SelectedLog != null && SelectedLog.Selectable) { Debug.WriteLine(@"Selected log: " + SelectedLog.filepath); logUploadText.Append("[MODE]logs\n"); logUploadText.AppendLine(LogCollector.CollectLogs(SelectedLog.filepath)); logUploadText.Append("\n"); } var logtext = logUploadText.ToString(); if (logtext != null) { CollectionStatusMessage = "Compressing for upload"; var lzmalog = SevenZipHelper.LZMA.CompressToLZMAFile(Encoding.UTF8.GetBytes(logtext)); try { //this doesn't need to technically be async, but library doesn't have non-async method. //DEBUG ONLY!!! CollectionStatusMessage = "Uploading to ME3Tweaks"; #if DEBUG string responseString = @"https://me3tweaks.com/modmanager/logservice/logupload2.php".PostUrlEncodedAsync(new { LogData = Convert.ToBase64String(lzmalog), ModManagerVersion = App.BuildNumber, CrashLog = isPreviousCrashLog }).ReceiveString().Result; #else string responseString = @"https://me3tweaks.com/modmanager/logservice/logupload.php".PostUrlEncodedAsync(new { LogData = Convert.ToBase64String(lzmalog), ModManagerVersion = App.BuildNumber, CrashLog = isPreviousCrashLog }).ReceiveString().Result; #endif Uri uriResult; bool result = Uri.TryCreate(responseString, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); if (result) { //should be valid URL. //diagnosticsWorker.ReportProgress(0, new ThreadCommand(SET_DIAGTASK_ICON_GREEN, Image_Upload)); //e.Result = responseString; Log.Information(@"Result from server for log upload: " + responseString); b.Result = responseString; return; } else { Log.Error(@"Error uploading log. The server responded with: " + responseString); b.Result = M3L.GetString(M3L.string_interp_serverRejectedTheUpload, responseString); } } catch (AggregateException e) { Exception ex = e.InnerException; string exmessage = ex.Message; b.Result = M3L.GetString(M3L.string_interp_logWasUnableToUpload, exmessage); } catch (FlurlHttpTimeoutException) { // FlurlHttpTimeoutException derives from FlurlHttpException; catch here only // if you want to handle timeouts as a special case Log.Error(@"Request timed out while uploading log."); b.Result = M3L.GetString(M3L.string_interp_requestTimedOutUploading); } catch (Exception ex) { // ex.Message contains rich details, inclulding the URL, verb, response status, // and request and response bodies (if available) Log.Error(@"Handled error uploading log: " + App.FlattenException(ex)); string exmessage = ex.Message; var index = exmessage.IndexOf(@"Request body:"); if (index > 0) { exmessage = exmessage.Substring(0, index); } b.Result = M3L.GetString(M3L.string_interp_logWasUnableToUpload, exmessage); } } else { //Log pull failed } }; bw.RunWorkerCompleted += (a, b) => { if (b.Result is string response) { if (response.StartsWith(@"http")) { Utilities.OpenWebpage(response); } else { OnClosing(DataEventArgs.Empty); var res = M3L.ShowDialog(Window.GetWindow(this), response, M3L.GetString(M3L.string_logUploadFailed), MessageBoxButton.OK, MessageBoxImage.Error); return; } } OnClosing(DataEventArgs.Empty); }; bw.RunWorkerAsync(); }
private async void CollectAndUploadLog() { var pd = await this.ShowProgressAsync("Uploading log", $"Please wait while the application log is uploaded to the ME3Tweaks Log Viewing Service."); pd.SetIndeterminate(); NamedBackgroundWorker nbw = new NamedBackgroundWorker("DiagnosticsWorker"); nbw.DoWork += (a, b) => { //ProgressIndeterminate = true; //GameTarget target = GameChosen != null ? Locations.GetTarget(GameChosen.Value) : null; StringBuilder logUploadText = new StringBuilder(); string logText = ""; //if (target != null) //{ // logUploadText.Append("[MODE]diagnostics\n"); //do not localize // logUploadText.Append(LogCollector.PerformDiagnostic(target, FullDiagChosen, // x => DiagnosticStatusText = x, // x => // { // ProgressIndeterminate = false; // ProgressValue = x; // }, // () => ProgressIndeterminate = true)); // logUploadText.Append("\n"); //do not localize //} if (SelectedLogForUpload != null) { logUploadText.Append("[MODE]logs\n"); //do not localize logUploadText.AppendLine(LogCollector.CollectLogs(SelectedLogForUpload.filepath)); logUploadText.Append("\n"); //do not localize } //DiagnosticStatusText = "Uploading to log viewing service"; //ProgressIndeterminate = true; var response = LogUploader.UploadLog(logUploadText.ToString(), "https://me3tweaks.com/masseffect2randomizer/logservice/logupload"); if (response.uploaded) { var DiagnosticResultText = response.result; if (response.result.StartsWith("http")) { Utilities.OpenWebPage(response.result); } } if (!response.uploaded || QuickFixHelper.IsQuickFixEnabled(QuickFixHelper.QuickFixName.ForceSavingLogLocally)) { // Upload failed. var GeneratedLogPath = Path.Combine(LogCollector.LogDir, $"FailedLogUpload_{DateTime.Now.ToString("s").Replace(":", ".")}.txt"); File.WriteAllText(GeneratedLogPath, logUploadText.ToString()); } //DiagnosticComplete = true; //DiagnosticInProgress = false; }; nbw.RunWorkerCompleted += async(sender, args) => { CommandManager.InvalidateRequerySuggested(); LogUploaderFlyoutOpen = false; await pd.CloseAsync(); }; //DiagnosticInProgress = true; nbw.RunWorkerAsync(); }