1
- using System ;
1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
2
4
using PlayFab ;
3
5
using PlayFab . ClientModels ;
4
6
using UnityEngine ;
@@ -31,12 +33,15 @@ public PlayFabCloudScriptResponseLogsErrorCode LogsErrorCode
31
33
return PlayFabCloudScriptResponseLogsErrorCode . NoError ;
32
34
}
33
35
34
- if ( Result . Logs . Count <= 0 )
36
+ var resultErrorLogs = Result . Logs . Where ( x => x . Level == "Error" ) . ToList ( ) ;
37
+ if ( resultErrorLogs . Count <= 0 )
35
38
{
36
39
return PlayFabCloudScriptResponseLogsErrorCode . Unknown ;
37
40
}
38
-
39
- if ( Result . Logs [ 0 ] . Data == null )
41
+
42
+ // we look at the last error in logs as that's where error codes thrown via cloud script should be located.
43
+ var lastResultErrorLog = resultErrorLogs . Last ( ) ;
44
+ if ( lastResultErrorLog . Data == null )
40
45
{
41
46
return PlayFabCloudScriptResponseLogsErrorCode . Unknown ;
42
47
}
@@ -48,8 +53,10 @@ public PlayFabCloudScriptResponseLogsErrorCode LogsErrorCode
48
53
//explicitly instantiate to fix bug where unity strips out LogsErrorData because it thinks it's not used
49
54
//see https://community.playfab.com/comments/60164/view.html
50
55
var logsErrorData = new LogsErrorData ( ) ;
51
- logsErrorData = serializer . DeserializeObject < LogsErrorData > ( Result . Logs [ 0 ] . Data . ToString ( ) ) ;
52
- return logsErrorData . ErrorCode ;
56
+ logsErrorData = serializer . DeserializeObject < LogsErrorData > ( lastResultErrorLog . Data . ToString ( ) ) ;
57
+
58
+ //if our ErrorCode is == 0 this is likely an error code from PlayFab so just say Unknown
59
+ return logsErrorData . ErrorCode == 0 ? PlayFabCloudScriptResponseLogsErrorCode . Unknown : logsErrorData . ErrorCode ;
53
60
}
54
61
catch ( Exception )
55
62
{
@@ -59,6 +66,51 @@ public PlayFabCloudScriptResponseLogsErrorCode LogsErrorCode
59
66
return PlayFabCloudScriptResponseLogsErrorCode . Unknown ;
60
67
}
61
68
}
69
+
70
+ /// <summary>
71
+ /// Converts a <see cref="PlayFabError"/> to a <see cref="PlayFabCloudScriptResponse"/> with <see cref="LogsErrorData"/>
72
+ /// <remarks>This can be useful when relying on <see cref="LogsErrorCode"/> to check cloud scripts errors</remarks>
73
+ /// </summary>
74
+ /// <param name="playFabError">The PlayFabError to convert</param>
75
+ /// <typeparam name="T">The type of reponse we will return, doesn't do much but can be nice for easily returning same return type</typeparam>
76
+ /// <returns>A "success" cloud script response marked with a "ContainsError" from <see cref="LogsErrorCode"/></returns>
77
+ public static PlayFabCloudScriptResponse < T > ConvertToLogsError < T > ( PlayFabError playFabError )
78
+ {
79
+ //prefer this so we are using all PlayFab json deserialization
80
+ var serializer = PluginManager . GetPlugin < ISerializerPlugin > ( PluginContract . PlayFab_Serializer ) ;
81
+ var errorCode = PlayFabCloudScriptResponseLogsErrorCode . Unknown ;
82
+ try
83
+ {
84
+ errorCode = ( PlayFabCloudScriptResponseLogsErrorCode ) ( int ) playFabError . Error ;
85
+ }
86
+ catch ( Exception e )
87
+ {
88
+ Debug . LogError (
89
+ "ConvertToLogsError tried to convert PlayFabErrorCode to PlayFabCloudScriptResponseLogsErrorCode and failed. Unknown error will be used." ) ;
90
+ }
91
+ var logsErrorData = new LogsErrorData
92
+ {
93
+ ErrorCode = errorCode ,
94
+ ErrorMessage = playFabError . ErrorMessage
95
+ } ;
96
+ return new PlayFabCloudScriptResponse < T > ( new ExecuteCloudScriptResult
97
+ {
98
+ Error = new ScriptExecutionError
99
+ {
100
+ Error = "ConvertToLogsError" ,
101
+ Message = $ "This error was generated by PlayFabCloudScriptResponse.ConvertToLogsError."
102
+ } ,
103
+ Logs = new List < LogStatement >
104
+ {
105
+ new LogStatement
106
+ {
107
+ Data = serializer . SerializeObject ( logsErrorData ) ,
108
+ Level = "Error" ,
109
+ Message = playFabError . ErrorMessage
110
+ }
111
+ }
112
+ } , null ) ;
113
+ }
62
114
}
63
115
64
116
public class PlayFabCloudScriptResponse < T > : PlayFabCloudScriptResponse
@@ -85,6 +137,10 @@ public T FunctionResult
85
137
86
138
/// <summary>
87
139
/// Allows us to map a cloud script error code using log.error(message,object errorCodeDataObject)
140
+ /// <remarks>
141
+ /// PlayFab ErrorCodes = 1 - 19999 (Should directly map to <see cref="PlayFabErrorCode"/>.<br/>
142
+ /// Custom error codes = -1 and 20000+.
143
+ /// </remarks>
88
144
/// <code>
89
145
/// function throwError(message){
90
146
/// let errorDataObject = {};
@@ -101,8 +157,11 @@ public enum PlayFabCloudScriptResponseLogsErrorCode
101
157
NoError = - 1 ,
102
158
Unknown = 1 ,
103
159
InvalidParams = 1000 ,
104
- PlayerStatsNotFoundForLeaderboard = 1001 ,
105
- LeaderboardEmpty = 1002
160
+ AccountNotFound = 1001 ,
161
+ UsersAlreadyFriends = 1183 ,
162
+ //--- Our error codes below ---
163
+ PlayerStatsNotFoundForLeaderboard = 20001 ,
164
+ LeaderboardEmpty = 20002
106
165
}
107
166
108
167
/// <summary>
@@ -111,5 +170,6 @@ public enum PlayFabCloudScriptResponseLogsErrorCode
111
170
public class LogsErrorData
112
171
{
113
172
public PlayFabCloudScriptResponseLogsErrorCode ErrorCode ;
173
+ public string ErrorMessage ;
114
174
}
115
175
}
0 commit comments