summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/settings.h3
-rw-r--r--src/core/telemetry_session.cpp57
-rw-r--r--src/core/telemetry_session.h12
3 files changed, 71 insertions, 1 deletions
diff --git a/src/core/settings.h b/src/core/settings.h
index ca657719a..bf8014c5a 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -130,7 +130,10 @@ struct Values {
130 u16 gdbstub_port; 130 u16 gdbstub_port;
131 131
132 // WebService 132 // WebService
133 bool enable_telemetry;
133 std::string telemetry_endpoint_url; 134 std::string telemetry_endpoint_url;
135 std::string citra_username;
136 std::string citra_token;
134} extern values; 137} extern values;
135 138
136// a special value for Values::region_value indicating that citra will automatically select a region 139// a special value for Values::region_value indicating that citra will automatically select a region
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index 94483f385..104a16cc9 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -3,8 +3,10 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <cstring> 5#include <cstring>
6#include <cryptopp/osrng.h>
6 7
7#include "common/assert.h" 8#include "common/assert.h"
9#include "common/file_util.h"
8#include "common/scm_rev.h" 10#include "common/scm_rev.h"
9#include "common/x64/cpu_detect.h" 11#include "common/x64/cpu_detect.h"
10#include "core/core.h" 12#include "core/core.h"
@@ -29,12 +31,65 @@ static const char* CpuVendorToStr(Common::CPUVendor vendor) {
29 UNREACHABLE(); 31 UNREACHABLE();
30} 32}
31 33
34static u64 GenerateTelemetryId() {
35 u64 telemetry_id{};
36 CryptoPP::AutoSeededRandomPool rng;
37 rng.GenerateBlock(reinterpret_cast<CryptoPP::byte*>(&telemetry_id), sizeof(u64));
38 return telemetry_id;
39}
40
41u64 GetTelemetryId() {
42 u64 telemetry_id{};
43 static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
44
45 if (FileUtil::Exists(filename)) {
46 FileUtil::IOFile file(filename, "rb");
47 if (!file.IsOpen()) {
48 LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
49 return {};
50 }
51 file.ReadBytes(&telemetry_id, sizeof(u64));
52 } else {
53 FileUtil::IOFile file(filename, "wb");
54 if (!file.IsOpen()) {
55 LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
56 return {};
57 }
58 telemetry_id = GenerateTelemetryId();
59 file.WriteBytes(&telemetry_id, sizeof(u64));
60 }
61
62 return telemetry_id;
63}
64
65u64 RegenerateTelemetryId() {
66 const u64 new_telemetry_id{GenerateTelemetryId()};
67 static const std::string& filename{FileUtil::GetUserPath(D_CONFIG_IDX) + "telemetry_id"};
68
69 FileUtil::IOFile file(filename, "wb");
70 if (!file.IsOpen()) {
71 LOG_ERROR(Core, "failed to open telemetry_id: %s", filename.c_str());
72 return {};
73 }
74 file.WriteBytes(&new_telemetry_id, sizeof(u64));
75 return new_telemetry_id;
76}
77
32TelemetrySession::TelemetrySession() { 78TelemetrySession::TelemetrySession() {
33#ifdef ENABLE_WEB_SERVICE 79#ifdef ENABLE_WEB_SERVICE
34 backend = std::make_unique<WebService::TelemetryJson>(); 80 if (Settings::values.enable_telemetry) {
81 backend = std::make_unique<WebService::TelemetryJson>(
82 Settings::values.telemetry_endpoint_url, Settings::values.citra_username,
83 Settings::values.citra_token);
84 } else {
85 backend = std::make_unique<Telemetry::NullVisitor>();
86 }
35#else 87#else
36 backend = std::make_unique<Telemetry::NullVisitor>(); 88 backend = std::make_unique<Telemetry::NullVisitor>();
37#endif 89#endif
90 // Log one-time top-level information
91 AddField(Telemetry::FieldType::None, "TelemetryId", GetTelemetryId());
92
38 // Log one-time session start information 93 // Log one-time session start information
39 const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>( 94 const s64 init_time{std::chrono::duration_cast<std::chrono::milliseconds>(
40 std::chrono::system_clock::now().time_since_epoch()) 95 std::chrono::system_clock::now().time_since_epoch())
diff --git a/src/core/telemetry_session.h b/src/core/telemetry_session.h
index cf53835c3..65613daae 100644
--- a/src/core/telemetry_session.h
+++ b/src/core/telemetry_session.h
@@ -35,4 +35,16 @@ private:
35 std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields 35 std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
36}; 36};
37 37
38/**
39 * Gets TelemetryId, a unique identifier used for the user's telemetry sessions.
40 * @returns The current TelemetryId for the session.
41 */
42u64 GetTelemetryId();
43
44/**
45 * Regenerates TelemetryId, a unique identifier used for the user's telemetry sessions.
46 * @returns The new TelemetryId that was generated.
47 */
48u64 RegenerateTelemetryId();
49
38} // namespace Core 50} // namespace Core