mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #4369 from FearlessTobi/compat-new
compatdb: Use a seperate endpoint for testcase submission
This commit is contained in:
		
						commit
						9d05fbbef4
					
				
					 8 changed files with 67 additions and 9 deletions
				
			
		|  | @ -5,6 +5,7 @@ | ||||||
| #include <QButtonGroup> | #include <QButtonGroup> | ||||||
| #include <QMessageBox> | #include <QMessageBox> | ||||||
| #include <QPushButton> | #include <QPushButton> | ||||||
|  | #include <QtConcurrent/qtconcurrentrun.h> | ||||||
| #include "citra_qt/compatdb.h" | #include "citra_qt/compatdb.h" | ||||||
| #include "common/telemetry.h" | #include "common/telemetry.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
|  | @ -21,6 +22,8 @@ CompatDB::CompatDB(QWidget* parent) | ||||||
|     connect(ui->radioButton_IntroMenu, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_IntroMenu, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|     connect(ui->radioButton_WontBoot, &QRadioButton::clicked, this, &CompatDB::EnableNext); |     connect(ui->radioButton_WontBoot, &QRadioButton::clicked, this, &CompatDB::EnableNext); | ||||||
|     connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit); |     connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit); | ||||||
|  |     connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this, | ||||||
|  |             &CompatDB::OnTestcaseSubmitted); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| CompatDB::~CompatDB() = default; | CompatDB::~CompatDB() = default; | ||||||
|  | @ -46,18 +49,38 @@ void CompatDB::Submit() { | ||||||
|         } |         } | ||||||
|         break; |         break; | ||||||
|     case CompatDBPage::Final: |     case CompatDBPage::Final: | ||||||
|  |         back(); | ||||||
|         LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId()); |         LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId()); | ||||||
|         Core::Telemetry().AddField(Telemetry::FieldType::UserFeedback, "Compatibility", |         Core::Telemetry().AddField(Telemetry::FieldType::UserFeedback, "Compatibility", | ||||||
|                                    compatibility->checkedId()); |                                    compatibility->checkedId()); | ||||||
|         // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
 | 
 | ||||||
|         // workaround
 |         button(NextButton)->setEnabled(false); | ||||||
|  |         button(NextButton)->setText(tr("Submitting")); | ||||||
|         button(QWizard::CancelButton)->setVisible(false); |         button(QWizard::CancelButton)->setVisible(false); | ||||||
|  | 
 | ||||||
|  |         testcase_watcher.setFuture(QtConcurrent::run( | ||||||
|  |             [this]() { return Core::System::GetInstance().TelemetrySession().SubmitTestcase(); })); | ||||||
|         break; |         break; | ||||||
|     default: |     default: | ||||||
|         LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); |         LOG_ERROR(Frontend, "Unexpected page: {}", currentId()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void CompatDB::OnTestcaseSubmitted() { | ||||||
|  |     if (!testcase_watcher.result()) { | ||||||
|  |         QMessageBox::critical(this, tr("Communication error"), | ||||||
|  |                               tr("An error occured while sending the Testcase")); | ||||||
|  |         button(NextButton)->setEnabled(true); | ||||||
|  |         button(NextButton)->setText(tr("Next")); | ||||||
|  |         button(QWizard::CancelButton)->setVisible(true); | ||||||
|  |     } else { | ||||||
|  |         next(); | ||||||
|  |         // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
 | ||||||
|  |         // workaround
 | ||||||
|  |         button(QWizard::CancelButton)->setVisible(false); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void CompatDB::EnableNext() { | void CompatDB::EnableNext() { | ||||||
|     button(NextButton)->setEnabled(true); |     button(NextButton)->setEnabled(true); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <memory> | #include <memory> | ||||||
|  | #include <QFutureWatcher> | ||||||
| #include <QWizard> | #include <QWizard> | ||||||
| 
 | 
 | ||||||
| namespace Ui { | namespace Ui { | ||||||
|  | @ -19,8 +20,11 @@ public: | ||||||
|     ~CompatDB(); |     ~CompatDB(); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |     QFutureWatcher<bool> testcase_watcher; | ||||||
|  | 
 | ||||||
|     std::unique_ptr<Ui::CompatDB> ui; |     std::unique_ptr<Ui::CompatDB> ui; | ||||||
| 
 | 
 | ||||||
|     void Submit(); |     void Submit(); | ||||||
|  |     void OnTestcaseSubmitted(); | ||||||
|     void EnableNext(); |     void EnableNext(); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -82,6 +82,8 @@ | ||||||
|     <addaction name="action_Stop"/> |     <addaction name="action_Stop"/> | ||||||
|     <addaction name="action_Restart"/> |     <addaction name="action_Restart"/> | ||||||
|     <addaction name="separator"/> |     <addaction name="separator"/> | ||||||
|  |     <addaction name="action_Report_Compatibility"/> | ||||||
|  |     <addaction name="separator"/> | ||||||
|     <addaction name="action_Configure"/> |     <addaction name="action_Configure"/> | ||||||
|    </widget> |    </widget> | ||||||
|    <widget class="QMenu" name="menu_View"> |    <widget class="QMenu" name="menu_View"> | ||||||
|  | @ -148,8 +150,6 @@ | ||||||
|     <addaction name="action_Check_For_Updates"/> |     <addaction name="action_Check_For_Updates"/> | ||||||
|     <addaction name="action_Open_Maintenance_Tool"/> |     <addaction name="action_Open_Maintenance_Tool"/> | ||||||
|     <addaction name="separator"/> |     <addaction name="separator"/> | ||||||
|     <addaction name="action_Report_Compatibility"/> |  | ||||||
|     <addaction name="separator"/> |  | ||||||
|     <addaction name="action_FAQ"/> |     <addaction name="action_FAQ"/> | ||||||
|     <addaction name="action_About"/> |     <addaction name="action_About"/> | ||||||
|    </widget> |    </widget> | ||||||
|  |  | ||||||
|  | @ -153,6 +153,7 @@ struct VisitorInterface : NonCopyable { | ||||||
| 
 | 
 | ||||||
|     /// Completion method, called once all fields have been visited
 |     /// Completion method, called once all fields have been visited
 | ||||||
|     virtual void Complete() = 0; |     virtual void Complete() = 0; | ||||||
|  |     virtual bool SubmitTestcase() = 0; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  | @ -178,6 +179,9 @@ struct NullVisitor : public VisitorInterface { | ||||||
|     void Visit(const Field<std::chrono::microseconds>& /*field*/) override {} |     void Visit(const Field<std::chrono::microseconds>& /*field*/) override {} | ||||||
| 
 | 
 | ||||||
|     void Complete() override {} |     void Complete() override {} | ||||||
|  |     bool SubmitTestcase() override { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Telemetry
 | } // namespace Telemetry
 | ||||||
|  |  | ||||||
|  | @ -203,4 +203,13 @@ TelemetrySession::~TelemetrySession() { | ||||||
|     backend = nullptr; |     backend = nullptr; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool TelemetrySession::SubmitTestcase() { | ||||||
|  | #ifdef ENABLE_WEB_SERVICE | ||||||
|  |     field_collection.Accept(*backend); | ||||||
|  |     return backend->SubmitTestcase(); | ||||||
|  | #else | ||||||
|  |     return false; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace Core
 | } // namespace Core
 | ||||||
|  |  | ||||||
|  | @ -31,6 +31,12 @@ public: | ||||||
|         field_collection.AddField(type, name, std::move(value)); |         field_collection.AddField(type, name, std::move(value)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Submits a Testcase. | ||||||
|  |      * @returns A bool indicating whether the submission succeeded | ||||||
|  |      */ | ||||||
|  |     bool SubmitTestcase(); | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     Telemetry::FieldCollection field_collection; ///< Tracks all added fields for the session
 |     Telemetry::FieldCollection field_collection; ///< Tracks all added fields for the session
 | ||||||
|     std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
 |     std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
 | ||||||
|  |  | ||||||
|  | @ -102,16 +102,27 @@ void TelemetryJson::Complete() { | ||||||
|     impl->SerializeSection(Telemetry::FieldType::App, "App"); |     impl->SerializeSection(Telemetry::FieldType::App, "App"); | ||||||
|     impl->SerializeSection(Telemetry::FieldType::Session, "Session"); |     impl->SerializeSection(Telemetry::FieldType::Session, "Session"); | ||||||
|     impl->SerializeSection(Telemetry::FieldType::Performance, "Performance"); |     impl->SerializeSection(Telemetry::FieldType::Performance, "Performance"); | ||||||
|     impl->SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback"); |  | ||||||
|     impl->SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig"); |     impl->SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig"); | ||||||
|     impl->SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem"); |     impl->SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem"); | ||||||
| 
 | 
 | ||||||
|     auto content = impl->TopSection().dump(); |     auto content = impl->TopSection().dump(); | ||||||
|     // Send the telemetry async but don't handle the errors since they were written to the log
 |     // Send the telemetry async but don't handle the errors since they were written to the log
 | ||||||
|     Common::DetachedTasks::AddTask( |     Common::DetachedTasks::AddTask([host{impl->host}, content]() { | ||||||
|         [host{impl->host}, username{impl->username}, token{impl->token}, content]() { |         Client{host, "", ""}.PostJson("/telemetry", content, true); | ||||||
|             Client{host, username, token}.PostJson("/telemetry", content, true); |     }); | ||||||
|         }); | } | ||||||
|  | 
 | ||||||
|  | bool TelemetryJson::SubmitTestcase() { | ||||||
|  |     impl->SerializeSection(Telemetry::FieldType::App, "App"); | ||||||
|  |     impl->SerializeSection(Telemetry::FieldType::Session, "Session"); | ||||||
|  |     impl->SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback"); | ||||||
|  |     impl->SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem"); | ||||||
|  | 
 | ||||||
|  |     auto content = impl->TopSection().dump(); | ||||||
|  |     Client client(impl->host, impl->username, impl->token); | ||||||
|  |     auto value = client.PostJson("/gamedb/testcase", content, false); | ||||||
|  | 
 | ||||||
|  |     return value.result_code == Common::WebResult::Code::Success; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } // namespace WebService
 | } // namespace WebService
 | ||||||
|  |  | ||||||
|  | @ -36,6 +36,7 @@ public: | ||||||
|     void Visit(const Telemetry::Field<std::chrono::microseconds>& field) override; |     void Visit(const Telemetry::Field<std::chrono::microseconds>& field) override; | ||||||
| 
 | 
 | ||||||
|     void Complete() override; |     void Complete() override; | ||||||
|  |     bool SubmitTestcase() override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     struct Impl; |     struct Impl; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue