11#include " AmplitudeUnreal.h"
22#include " AmplitudeProvider.h"
33#include " Analytics.h"
4- #include < exception>
54#if PLATFORM_APPLE
65#include " AmplitudeiOSBridge.h"
76#endif
@@ -63,11 +62,22 @@ void FAmplitudeProvider::RecordEvent(const FString &EventName, const TArray<FAna
6362{
6463 std::string ConvertedEventName = std::string (TCHAR_TO_UTF8 (*EventName));
6564 std::vector<std::pair<std::string, std::string>> propertyPairs;
66- for (FAnalyticsEventAttribute Attribute : Attributes)
65+
66+ // Add default attributes first
67+ for (const FAnalyticsEventAttribute& DefaultAttribute : DefaultEventAttributes)
6768 {
6869 std::pair<std::string, std::string> propertyPair;
69- propertyPair.first = std::string (TCHAR_TO_UTF8 (*Attribute.AttrName ));
70- propertyPair.second = std::string (TCHAR_TO_UTF8 (*Attribute.AttrValueString ));
70+ propertyPair.first = std::string (TCHAR_TO_UTF8 (*DefaultAttribute.GetName ()));
71+ propertyPair.second = std::string (TCHAR_TO_UTF8 (*DefaultAttribute.GetValue ()));
72+ propertyPairs.push_back (propertyPair);
73+ }
74+
75+ // Add event-specific attributes
76+ for (const FAnalyticsEventAttribute& Attribute : Attributes)
77+ {
78+ std::pair<std::string, std::string> propertyPair;
79+ propertyPair.first = std::string (TCHAR_TO_UTF8 (*Attribute.GetName ()));
80+ propertyPair.second = std::string (TCHAR_TO_UTF8 (*Attribute.GetValue ()));
7181 propertyPairs.push_back (propertyPair);
7282 }
7383
@@ -85,23 +95,25 @@ FString FAmplitudeProvider::GetSessionID() const
8595 FString SessionId = FString::SanitizeFloat (Bridge.getSessionId ());
8696 return SessionId;
8797#endif
98+ return TEXT (" -1" );
8899}
89100
90101bool FAmplitudeProvider::SetSessionID (const FString &InSessionID)
91102{
92- try
103+ // Use Unreal's string conversion instead of std::stoi to avoid exceptions
104+ if (InSessionID.IsNumeric ())
93105 {
94106#if PLATFORM_APPLE
95107 ios_bridge::AmplitudeiOSBridge Bridge;
96- long ConvertedSessionId = std::stoi ( std::string ( TCHAR_TO_UTF8 ( *InSessionID)) );
108+ long ConvertedSessionId = FCString::Atoi64 ( *InSessionID);
97109 Bridge.setSessionId (ConvertedSessionId);
98110#endif
99111 return true ;
100112 }
101- catch (std::exception &e)
102- {
103- return false ;
104- }
113+
114+ // Log error and return false if the session ID is not numeric
115+ UE_LOG (LogAnalytics, Warning, TEXT ( " SetSessionID failed: Invalid session ID format: %s " ), *InSessionID) ;
116+ return false ;
105117}
106118
107119void FAmplitudeProvider::FlushEvents ()
@@ -156,3 +168,23 @@ void FAmplitudeProvider::SetAge(const int32 InAge)
156168{
157169 SetUserProperty (TEXT (" Age" ), FString::FromInt (InAge));
158170}
171+
172+ void FAmplitudeProvider::SetDefaultEventAttributes (TArray<FAnalyticsEventAttribute>&& Attributes)
173+ {
174+ DefaultEventAttributes = MoveTemp (Attributes);
175+ }
176+
177+ TArray<FAnalyticsEventAttribute> FAmplitudeProvider::GetDefaultEventAttributesSafe () const
178+ {
179+ return DefaultEventAttributes;
180+ }
181+
182+ int32 FAmplitudeProvider::GetDefaultEventAttributeCount () const
183+ {
184+ return DefaultEventAttributes.Num ();
185+ }
186+
187+ FAnalyticsEventAttribute FAmplitudeProvider::GetDefaultEventAttribute (int AttributeIndex) const
188+ {
189+ return DefaultEventAttributes[AttributeIndex];
190+ }
0 commit comments