From a404a0ad42fd1f9917392ab2eeaadf1fe661897b Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 19:18:35 +0200 Subject: [PATCH 01/13] Add Feedback API with Cocoa implementation --- src/register_types.cpp | 2 ++ src/sentry/cocoa/cocoa_includes.h | 1 + src/sentry/cocoa/cocoa_sdk.h | 2 ++ src/sentry/cocoa/cocoa_sdk.mm | 19 ++++++++++++++++ src/sentry/disabled/disabled_sdk.h | 2 ++ src/sentry/internal_sdk.h | 3 +++ src/sentry/sentry_feedback.cpp | 14 ++++++++++++ src/sentry/sentry_feedback.h | 35 ++++++++++++++++++++++++++++++ src/sentry/sentry_sdk.cpp | 10 +++++++++ src/sentry/sentry_sdk.h | 2 ++ 10 files changed, 90 insertions(+) create mode 100644 src/sentry/sentry_feedback.cpp create mode 100644 src/sentry/sentry_feedback.h diff --git a/src/register_types.cpp b/src/register_types.cpp index 6eff33d2..4a624b3c 100644 --- a/src/register_types.cpp +++ b/src/register_types.cpp @@ -9,6 +9,7 @@ #include "sentry/sentry_attachment.h" #include "sentry/sentry_breadcrumb.h" #include "sentry/sentry_event.h" +#include "sentry/sentry_feedback.h" #include "sentry/sentry_options.h" #include "sentry/sentry_sdk.h" #include "sentry/sentry_user.h" @@ -48,6 +49,7 @@ void register_runtime_classes() { GDREGISTER_INTERNAL_CLASS(RuntimeConfig); GDREGISTER_CLASS(SentryUser); GDREGISTER_CLASS(SentryTimestamp); + GDREGISTER_CLASS(SentryFeedback); GDREGISTER_CLASS(SentrySDK); GDREGISTER_ABSTRACT_CLASS(SentryAttachment); GDREGISTER_ABSTRACT_CLASS(SentryEvent); diff --git a/src/sentry/cocoa/cocoa_includes.h b/src/sentry/cocoa/cocoa_includes.h index a4bf6bc5..b47161ef 100644 --- a/src/sentry/cocoa/cocoa_includes.h +++ b/src/sentry/cocoa/cocoa_includes.h @@ -29,6 +29,7 @@ using SentryException = ::SentryException; using SentryStacktrace = ::SentryStacktrace; using SentryFrame = ::SentryFrame; using SentryThread = ::SentryThread; +using SentryFeedback = ::SentryFeedback; } // namespace objc diff --git a/src/sentry/cocoa/cocoa_sdk.h b/src/sentry/cocoa/cocoa_sdk.h index 6bf2c3b9..5c83f042 100644 --- a/src/sentry/cocoa/cocoa_sdk.h +++ b/src/sentry/cocoa/cocoa_sdk.h @@ -34,6 +34,8 @@ class CocoaSDK : public InternalSDK { virtual Ref create_event() override; virtual String capture_event(const Ref &p_event) override; + virtual void capture_feedback(const Ref &p_feedback) override; + virtual void add_attachment(const Ref &p_attachment) override; virtual void init(const PackedStringArray &p_global_attachments, const Callable &p_configuration_callback) override; diff --git a/src/sentry/cocoa/cocoa_sdk.mm b/src/sentry/cocoa/cocoa_sdk.mm index 986dee9a..cba51d82 100644 --- a/src/sentry/cocoa/cocoa_sdk.mm +++ b/src/sentry/cocoa/cocoa_sdk.mm @@ -107,6 +107,25 @@ return event_id ? string_from_objc(event_id.sentryIdString) : String(); } +void CocoaSDK::capture_feedback(const Ref &p_feedback) { + ERR_FAIL_COND_MSG(p_feedback.is_null(), "Sentry: Can't capture feedback - feedback object is null."); + ERR_FAIL_COND_MSG(p_feedback->get_message().is_empty(), "Sentry: Can't capture feedback - feedback message is empty."); + + objc::SentryId *id = nil; + + if (!p_feedback->get_associated_event_id().is_empty()) { + id = [[objc::SentryId alloc] initWithUUIDString:string_to_objc(p_feedback->get_associated_event_id())]; + } + + objc::SentryFeedback *cocoa_feedback = [[objc::SentryFeedback alloc] initWithMessage:string_to_objc(p_feedback->get_message()) + name:string_to_objc_or_nil_if_empty(p_feedback->get_name()) + email:string_to_objc_or_nil_if_empty(p_feedback->get_contact_email()) + source:SentryFeedbackSourceCustom + associatedEventId:id + attachments:nil]; + [objc::SentrySDK captureFeedback:cocoa_feedback]; +} + void CocoaSDK::add_attachment(const Ref &p_attachment) { ERR_FAIL_COND_MSG(p_attachment.is_null(), "Sentry: Can't add null attachment."); diff --git a/src/sentry/disabled/disabled_sdk.h b/src/sentry/disabled/disabled_sdk.h index 84a48ed0..e27387ea 100644 --- a/src/sentry/disabled/disabled_sdk.h +++ b/src/sentry/disabled/disabled_sdk.h @@ -27,6 +27,8 @@ class DisabledSDK : public InternalSDK { virtual Ref create_event() override { return memnew(DisabledEvent); } virtual String capture_event(const Ref &p_event) override { return ""; } + virtual void capture_feedback(const Ref &p_feedback) override {} + virtual void add_attachment(const Ref &p_attachment) override {} virtual void init(const PackedStringArray &p_global_attachments, const Callable &p_configuration_callback) override {} diff --git a/src/sentry/internal_sdk.h b/src/sentry/internal_sdk.h index 28b0928a..4e464b4e 100644 --- a/src/sentry/internal_sdk.h +++ b/src/sentry/internal_sdk.h @@ -5,6 +5,7 @@ #include "sentry/sentry_attachment.h" #include "sentry/sentry_breadcrumb.h" #include "sentry/sentry_event.h" +#include "sentry/sentry_feedback.h" #include "sentry/sentry_user.h" #include @@ -37,6 +38,8 @@ class InternalSDK { virtual Ref create_event() = 0; virtual String capture_event(const Ref &p_event) = 0; + virtual void capture_feedback(const Ref &p_feedback) = 0; + virtual void add_attachment(const Ref &p_attachment) = 0; virtual void init(const PackedStringArray &p_global_attachments, const Callable &p_configuration_callback) = 0; diff --git a/src/sentry/sentry_feedback.cpp b/src/sentry/sentry_feedback.cpp new file mode 100644 index 00000000..85a3f850 --- /dev/null +++ b/src/sentry/sentry_feedback.cpp @@ -0,0 +1,14 @@ +#include "sentry_feedback.h" + +#include "sentry/util/simple_bind.h" + +namespace sentry { + +void SentryFeedback::_bind_methods() { + BIND_PROPERTY(SentryFeedback, PropertyInfo(Variant::STRING, "name"), set_name, get_name); + BIND_PROPERTY(SentryFeedback, PropertyInfo(Variant::STRING, "contact_email"), set_contact_email, get_contact_email); + BIND_PROPERTY(SentryFeedback, PropertyInfo(Variant::STRING, "message"), set_message, get_message); + BIND_PROPERTY(SentryFeedback, PropertyInfo(Variant::STRING, "associated_event_id"), set_associated_event_id, get_associated_event_id); +} + +} //namespace sentry diff --git a/src/sentry/sentry_feedback.h b/src/sentry/sentry_feedback.h new file mode 100644 index 00000000..7324ff67 --- /dev/null +++ b/src/sentry/sentry_feedback.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +using namespace godot; + +namespace sentry { + +class SentryFeedback : public RefCounted { + GDCLASS(SentryFeedback, RefCounted); + +private: + String name; + String contact_email; + String message; + String associated_event_id; + +protected: + static void _bind_methods(); + +public: + String get_name() const { return name; } + void set_name(const String &p_name) { name = p_name; } + + String get_contact_email() const { return contact_email; } + void set_contact_email(const String &p_contact_email) { contact_email = p_contact_email; } + + String get_message() const { return message; } + void set_message(const String &p_message) { message = p_message; } + + String get_associated_event_id() const { return associated_event_id; } + void set_associated_event_id(const String &p_associated_event_id) { associated_event_id = p_associated_event_id; } +}; + +} //namespace sentry diff --git a/src/sentry/sentry_sdk.cpp b/src/sentry/sentry_sdk.cpp index 5f8eb80f..b7621d71 100644 --- a/src/sentry/sentry_sdk.cpp +++ b/src/sentry/sentry_sdk.cpp @@ -182,6 +182,15 @@ String SentrySDK::capture_event(const Ref &p_event) { return internal_sdk->capture_event(p_event); } +void SentrySDK::capture_feedback(const Ref &p_feedback) { + ERR_FAIL_COND_MSG(p_feedback.is_null(), "Sentry: Can't capture feedback - feedback object is null."); + ERR_FAIL_COND_MSG(p_feedback->get_message().is_empty(), "Sentry: Can't capture feedback - feedback message is empty."); + if (p_feedback->get_message().length() > 4096) { + WARN_PRINT("Sentry: Feedback message is too long (max 4096 characters)."); + } + return internal_sdk->capture_feedback(p_feedback); +} + void SentrySDK::add_attachment(const Ref &p_attachment) { ERR_FAIL_COND_MSG(p_attachment.is_null(), "Sentry: Can't add null attachment."); internal_sdk->add_attachment(p_attachment); @@ -362,6 +371,7 @@ void SentrySDK::_bind_methods() { ClassDB::bind_method(D_METHOD("remove_user"), &SentrySDK::remove_user); ClassDB::bind_method(D_METHOD("create_event"), &SentrySDK::create_event); ClassDB::bind_method(D_METHOD("capture_event", "event"), &SentrySDK::capture_event); + ClassDB::bind_method(D_METHOD("capture_feedback", "feedback"), &SentrySDK::capture_feedback); ClassDB::bind_method(D_METHOD("add_attachment", "attachment"), &SentrySDK::add_attachment); // Hidden API methods -- used in testing. diff --git a/src/sentry/sentry_sdk.h b/src/sentry/sentry_sdk.h index a0fa8d98..4535c601 100644 --- a/src/sentry/sentry_sdk.h +++ b/src/sentry/sentry_sdk.h @@ -78,6 +78,8 @@ class SentrySDK : public Object { Ref create_event() const; String capture_event(const Ref &p_event); + void capture_feedback(const Ref &p_feedback); + void add_attachment(const Ref &p_attachment); // * Hidden API methods -- used in testing From 0c648bee61665a7c527f0c0a9101a37d886d28e2 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 19:22:23 +0200 Subject: [PATCH 02/13] Add class docs --- doc_classes/SentryFeedback.xml | 28 ++++++++++++++++++++++++++++ doc_classes/SentrySDK.xml | 7 +++++++ 2 files changed, 35 insertions(+) create mode 100644 doc_classes/SentryFeedback.xml diff --git a/doc_classes/SentryFeedback.xml b/doc_classes/SentryFeedback.xml new file mode 100644 index 00000000..305f2c05 --- /dev/null +++ b/doc_classes/SentryFeedback.xml @@ -0,0 +1,28 @@ + + + + Represents user feedback in Sentry. + + + + + + + + The identifier of an error event in the same project. [i]Optional[/i]. + Use this to explicitly link a related error in the feedback UI. + + + The email of the user who submitted the feedback. [i]Optional[/i]. + If excluded, Sentry attempts to fill this in with user context. Anonymous feedbacks (no name or email) are still accepted. + + + Comments of the user, describing what happened and/or sharing feedback. [i]Required[/i]. + The max length is 4096 characters. + + + The name of the user who submitted the feedback. [i]Optional[/i]. + If excluded, Sentry attempts to fill this in with user context. Anonymous feedbacks (no name or email) are still accepted. + + + diff --git a/doc_classes/SentrySDK.xml b/doc_classes/SentrySDK.xml index a2a250e5..dd199552 100644 --- a/doc_classes/SentrySDK.xml +++ b/doc_classes/SentrySDK.xml @@ -36,6 +36,13 @@ Captures [param event] and sends it to Sentry, returning the event ID. You can create an event with [method SentrySDK.create_event]. + + + + + Captures user [param feedback] and sends it to Sentry. The feedback can optionally be associated with a specific error event if the [member SentryFeedback.associated_event_id] is set. + + From de34e939a43f782b12f6411c702f5c304cf64035 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 19:24:11 +0200 Subject: [PATCH 03/13] Add basic properties test --- project/test/suites/test_feedback.gd | 22 ++++++++++++++++++++++ project/test/suites/test_feedback.gd.uid | 1 + 2 files changed, 23 insertions(+) create mode 100644 project/test/suites/test_feedback.gd create mode 100644 project/test/suites/test_feedback.gd.uid diff --git a/project/test/suites/test_feedback.gd b/project/test/suites/test_feedback.gd new file mode 100644 index 00000000..f092077f --- /dev/null +++ b/project/test/suites/test_feedback.gd @@ -0,0 +1,22 @@ +extends GdUnitTestSuite +## Test Feedback class. + + +func test_feedback_properties() -> void: + var feedback := SentryFeedback.new() + + assert_str(feedback.associated_event_id).is_empty() + feedback.associated_event_id = "082ce03eface41dd94b8c6b005382d5e" + assert_str(feedback.associated_event_id).is_equal("082ce03eface41dd94b8c6b005382d5e") + + assert_str(feedback.name).is_empty() + feedback.name = "Bob" + assert_str(feedback.name).is_equal(feedback.name) + + assert_str(feedback.contact_email).is_empty() + feedback.contact_email = "bob@example.com" + assert_str(feedback.contact_email).is_equal("bob@example.com") + + assert_str(feedback.message).is_empty() + feedback.message = "something happened" + assert_str(feedback.message).is_equal("something happened") diff --git a/project/test/suites/test_feedback.gd.uid b/project/test/suites/test_feedback.gd.uid new file mode 100644 index 00000000..c1167a90 --- /dev/null +++ b/project/test/suites/test_feedback.gd.uid @@ -0,0 +1 @@ +uid://m3p77wja6wk0 From cf86661e5e6f5e71fe278da0bfb83835de1ab3c9 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 19:34:26 +0200 Subject: [PATCH 04/13] Fix property test --- project/test/suites/test_feedback.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/test/suites/test_feedback.gd b/project/test/suites/test_feedback.gd index f092077f..c1a37721 100644 --- a/project/test/suites/test_feedback.gd +++ b/project/test/suites/test_feedback.gd @@ -11,7 +11,7 @@ func test_feedback_properties() -> void: assert_str(feedback.name).is_empty() feedback.name = "Bob" - assert_str(feedback.name).is_equal(feedback.name) + assert_str(feedback.name).is_equal("Bob") assert_str(feedback.contact_email).is_empty() feedback.contact_email = "bob@example.com" From 74508cefcb70c584a5ed559a9a1412437ee10750 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 20:35:23 +0200 Subject: [PATCH 05/13] Add native implementation --- src/sentry/native/native_sdk.cpp | 25 +++++++++++++++++++++++++ src/sentry/native/native_sdk.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/src/sentry/native/native_sdk.cpp b/src/sentry/native/native_sdk.cpp index 182034ff..f1134763 100644 --- a/src/sentry/native/native_sdk.cpp +++ b/src/sentry/native/native_sdk.cpp @@ -230,6 +230,31 @@ String NativeSDK::capture_event(const Ref &p_event) { return _uuid_as_string(uuid); } +void NativeSDK::capture_feedback(const Ref &p_feedback) { + ERR_FAIL_COND_MSG(p_feedback.is_null(), "Sentry: Can't capture feedback - feedback object is null."); + ERR_FAIL_COND_MSG(p_feedback->get_message().is_empty(), "Sentry: Can't capture feedback - feedback message is empty."); + + sentry_value_t feedback = sentry_value_new_object(); + + sentry_value_set_by_key(feedback, "message", + sentry_value_new_string(p_feedback->get_message().utf8())); + + if (!p_feedback->get_contact_email().is_empty()) { + sentry_value_set_by_key(feedback, "contact_email", + sentry_value_new_string(p_feedback->get_contact_email().utf8())); + } + if (!p_feedback->get_name().is_empty()) { + sentry_value_set_by_key(feedback, "name", + sentry_value_new_string(p_feedback->get_name().utf8())); + } + if (!p_feedback->get_associated_event_id().is_empty()) { + sentry_value_set_by_key(feedback, "associated_event_id", + sentry_value_new_string(p_feedback->get_associated_event_id().ascii())); + } + + sentry_capture_feedback(feedback); +} + void NativeSDK::add_attachment(const Ref &p_attachment) { ERR_FAIL_COND_MSG(p_attachment.is_null(), "Sentry: Can't add null attachment."); ERR_FAIL_NULL(ProjectSettings::get_singleton()); diff --git a/src/sentry/native/native_sdk.h b/src/sentry/native/native_sdk.h index 1634b095..a5760e62 100644 --- a/src/sentry/native/native_sdk.h +++ b/src/sentry/native/native_sdk.h @@ -34,6 +34,8 @@ class NativeSDK : public InternalSDK { virtual Ref create_event() override; virtual String capture_event(const Ref &p_event) override; + virtual void capture_feedback(const Ref &p_feedback) override; + virtual void add_attachment(const Ref &p_attachment) override; virtual void init(const PackedStringArray &p_global_attachments, const Callable &p_configuration_callback) override; From ea69cf89efd90d457e87a977ea68805553e670ce Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 20:42:41 +0200 Subject: [PATCH 06/13] Android extension side --- src/sentry/android/android_sdk.cpp | 11 +++++++++++ src/sentry/android/android_sdk.h | 2 ++ src/sentry/android/android_string_names.cpp | 1 + src/sentry/android/android_string_names.h | 1 + 4 files changed, 15 insertions(+) diff --git a/src/sentry/android/android_sdk.cpp b/src/sentry/android/android_sdk.cpp index d40d89e1..d7763118 100644 --- a/src/sentry/android/android_sdk.cpp +++ b/src/sentry/android/android_sdk.cpp @@ -119,6 +119,17 @@ String AndroidSDK::capture_event(const Ref &p_event) { return android_event->get_id(); } +void AndroidSDK::capture_feedback(const Ref &p_feedback) { + ERR_FAIL_NULL(android_plugin); + ERR_FAIL_COND_MSG(p_feedback.is_null(), "Sentry: Can't capture feedback - feedback object is null."); + ERR_FAIL_COND_MSG(p_feedback->get_message().is_empty(), "Sentry: Can't capture feedback - feedback message is empty."); + android_plugin->call(ANDROID_SN(captureFeedback), + p_feedback->get_message(), + p_feedback->get_contact_email(), + p_feedback->get_name(), + p_feedback->get_associated_event_id()); +} + void AndroidSDK::add_attachment(const Ref &p_attachment) { ERR_FAIL_COND(p_attachment.is_null()); diff --git a/src/sentry/android/android_sdk.h b/src/sentry/android/android_sdk.h index 5dbad09c..33bcddc1 100644 --- a/src/sentry/android/android_sdk.h +++ b/src/sentry/android/android_sdk.h @@ -47,6 +47,8 @@ class AndroidSDK : public InternalSDK { virtual Ref create_event() override; virtual String capture_event(const Ref &p_event) override; + virtual void capture_feedback(const Ref &p_feedback) override; + virtual void add_attachment(const Ref &p_attachment) override; virtual void init(const PackedStringArray &p_global_attachments, const Callable &p_configuration_callback) override; diff --git a/src/sentry/android/android_string_names.cpp b/src/sentry/android/android_string_names.cpp index 4426aa56..d180b0c4 100644 --- a/src/sentry/android/android_string_names.cpp +++ b/src/sentry/android/android_string_names.cpp @@ -31,6 +31,7 @@ AndroidStringNames::AndroidStringNames() { createEvent = StringName("createEvent"); releaseEvent = StringName("releaseEvent"); captureEvent = StringName("captureEvent"); + captureFeedback = StringName("captureFeedback"); addFileAttachment = StringName("addFileAttachment"); addBytesAttachment = StringName("addBytesAttachment"); diff --git a/src/sentry/android/android_string_names.h b/src/sentry/android/android_string_names.h index 7ee3eef1..dd0d27e2 100644 --- a/src/sentry/android/android_string_names.h +++ b/src/sentry/android/android_string_names.h @@ -43,6 +43,7 @@ class AndroidStringNames { StringName createEvent; StringName releaseEvent; StringName captureEvent; + StringName captureFeedback; StringName addFileAttachment; StringName addBytesAttachment; From 629c3028f2f01d96890483a8551e38eb94527efb Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 20:42:52 +0200 Subject: [PATCH 07/13] Test --- project/project_main_loop.gd | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/project/project_main_loop.gd b/project/project_main_loop.gd index def2f9f4..34d68638 100644 --- a/project/project_main_loop.gd +++ b/project/project_main_loop.gd @@ -26,6 +26,15 @@ func _initialize() -> void: # SentrySDK.add_attachment(...) # ... + # TODO: DELETEME + push_error("Level transition failed") + var feedback := SentryFeedback.new() + feedback.name = "Bob" + feedback.contact_email = "bob@example.com" + feedback.message = "Something happened" + feedback.associated_event_id = SentrySDK.get_last_event_id() + SentrySDK.capture_feedback(feedback) + ## before_send example func _on_before_send_to_sentry(ev: SentryEvent) -> SentryEvent: From b7068366ee38eaeb5df995a8a07452ad66b25495 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 20:57:14 +0200 Subject: [PATCH 08/13] Android bridge part --- .../sentry/godotplugin/SentryAndroidGodotPlugin.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt b/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt index 3b6a2c4f..bd9e0c80 100644 --- a/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt +++ b/android_lib/src/main/java/io/sentry/godotplugin/SentryAndroidGodotPlugin.kt @@ -10,8 +10,10 @@ import io.sentry.SentryEvent import io.sentry.SentryLevel import io.sentry.SentryOptions import io.sentry.android.core.SentryAndroid +import io.sentry.protocol.Feedback import io.sentry.protocol.Message import io.sentry.protocol.SentryException +import io.sentry.protocol.SentryId import io.sentry.protocol.SentryStackFrame import io.sentry.protocol.SentryStackTrace import io.sentry.protocol.User @@ -275,6 +277,17 @@ class SentryAndroidGodotPlugin(godot: Godot) : GodotPlugin(godot) { return id.toString() } + @UsedByGodot + fun captureFeedback(message: String, contactEmail: String, name: String, associatedEventId: String) { + val feedback = Feedback(message) + feedback.contactEmail = contactEmail.ifEmpty { null } + feedback.name = name.ifEmpty { null } + if (associatedEventId.isNotEmpty()) { + feedback.setAssociatedEventId(SentryId(associatedEventId)) + } + Sentry.captureFeedback(feedback) + } + @UsedByGodot fun eventGetId(eventHandle: Int): String { val id = getEvent(eventHandle)?.eventId ?: return "" From 4e0e411d48bde621f03ca4ad0f19a1bfee725a42 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 21:29:35 +0200 Subject: [PATCH 09/13] Update SentryFeedback.xml --- doc_classes/SentryFeedback.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc_classes/SentryFeedback.xml b/doc_classes/SentryFeedback.xml index 305f2c05..c134264b 100644 --- a/doc_classes/SentryFeedback.xml +++ b/doc_classes/SentryFeedback.xml @@ -4,6 +4,8 @@ Represents user feedback in Sentry. + [SentryFeedback] allows you to collect and send user feedback to Sentry. Create an instance of this class, set the required [member message] and optional fields, then submit it using [method SentrySDK.capture_feedback]. + To learn more, visit [url=https://docs.sentry.io/platforms/godot/user-feedback/]User Feedback[/url] documentation. From 7b9b59155aa2ca03e5a3c8d3ca7d9d94629e29b9 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 21:32:52 +0200 Subject: [PATCH 10/13] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 331d50e0..4e7c065d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Features + +- Add user feedback API for collecting and sending user feedback to Sentry ([#418](https://github.com/getsentry/sentry-godot/pull/418)) + ### Improvements - Detect when we're inside message logging to prevent SDK print operations through the Godot logger which cause runtime errors. ([#414](https://github.com/getsentry/sentry-godot/pull/414)) From 7ad0010bc5ff51a0f1e7d9df446ac0e38d425629 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 21:38:26 +0200 Subject: [PATCH 11/13] Revert "Test" This reverts commit 629c3028f2f01d96890483a8551e38eb94527efb. --- project/project_main_loop.gd | 9 --------- 1 file changed, 9 deletions(-) diff --git a/project/project_main_loop.gd b/project/project_main_loop.gd index 34d68638..def2f9f4 100644 --- a/project/project_main_loop.gd +++ b/project/project_main_loop.gd @@ -26,15 +26,6 @@ func _initialize() -> void: # SentrySDK.add_attachment(...) # ... - # TODO: DELETEME - push_error("Level transition failed") - var feedback := SentryFeedback.new() - feedback.name = "Bob" - feedback.contact_email = "bob@example.com" - feedback.message = "Something happened" - feedback.associated_event_id = SentrySDK.get_last_event_id() - SentrySDK.capture_feedback(feedback) - ## before_send example func _on_before_send_to_sentry(ev: SentryEvent) -> SentryEvent: From 5008810e536e327628629a46e2773d8e807d500a Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 21:42:33 +0200 Subject: [PATCH 12/13] Update SentrySDK.xml --- doc_classes/SentrySDK.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/doc_classes/SentrySDK.xml b/doc_classes/SentrySDK.xml index dd199552..6e3c4c3f 100644 --- a/doc_classes/SentrySDK.xml +++ b/doc_classes/SentrySDK.xml @@ -41,6 +41,7 @@ Captures user [param feedback] and sends it to Sentry. The feedback can optionally be associated with a specific error event if the [member SentryFeedback.associated_event_id] is set. + For more information, see the [SentryFeedback] class and visit the [url=https://docs.sentry.io/platforms/godot/user-feedback/]User Feedback documentation[/url]. From 121155e8300d5a48e84ef4767e347f79280c561e Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 14 Oct 2025 21:44:05 +0200 Subject: [PATCH 13/13] Update SentrySDK.xml --- doc_classes/SentrySDK.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc_classes/SentrySDK.xml b/doc_classes/SentrySDK.xml index 6e3c4c3f..df0c867c 100644 --- a/doc_classes/SentrySDK.xml +++ b/doc_classes/SentrySDK.xml @@ -41,7 +41,7 @@ Captures user [param feedback] and sends it to Sentry. The feedback can optionally be associated with a specific error event if the [member SentryFeedback.associated_event_id] is set. - For more information, see the [SentryFeedback] class and visit the [url=https://docs.sentry.io/platforms/godot/user-feedback/]User Feedback documentation[/url]. + For more information, see [SentryFeedback] class and visit [url=https://docs.sentry.io/platforms/godot/user-feedback/]User Feedback documentation[/url].