StdGenerator.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. [assembly: InternalsVisibleTo("Unity.Services.Analytics.Tests")]
  4. namespace Unity.Services.Analytics.Data
  5. {
  6. interface IDataGenerator
  7. {
  8. void GameRunning(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier);
  9. void SdkStartup(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier);
  10. void NewPlayer(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, string deviceModel);
  11. void GameStarted(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, string idLocalProject, string osVersion, bool isTiny, bool debugDevice, string userLocale);
  12. void GameEnded(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, DataGenerator.SessionEndState quitState);
  13. void AdImpression(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier,
  14. AdImpressionParameters adImpressionParameters);
  15. void Transaction(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, TransactionParameters transactionParameters);
  16. void TransactionFailed(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, TransactionFailedParameters transactionParameters);
  17. void ClientDevice(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier,
  18. string cpuType, string gpuType, Int64 cpuCores, Int64 ramTotal, Int64 screenWidth, Int64 screenHeight, Int64 screenDPI);
  19. void AcquisitionSource(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, AcquisitionSourceParameters acquisitionSourceParameters);
  20. }
  21. /// <summary>
  22. /// DataGenerator is used to push event data into the internal buffer.
  23. /// The reason its split like this is so we can test the output from
  24. /// The DataGenerator + InternalBuffer. If this output is validated we
  25. /// can be pretty confident we are always producing valid JSON for the
  26. /// backend.
  27. /// </summary>
  28. class DataGenerator : IDataGenerator
  29. {
  30. public void SdkStartup(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier)
  31. {
  32. buf.PushStartEvent("sdkStart", datetime, 1, true);
  33. buf.PushString(SdkVersion.SDK_VERSION, "sdkVersion");
  34. // Event Params
  35. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  36. buf.PushString("com.unity.services.analytics", "sdkName"); // Schema: Required
  37. buf.PushEndEvent();
  38. }
  39. public void GameRunning(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier)
  40. {
  41. buf.PushStartEvent("gameRunning", datetime, 1, true);
  42. // Event Params
  43. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  44. buf.PushEndEvent();
  45. }
  46. public void NewPlayer(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, string deviceModel)
  47. {
  48. buf.PushStartEvent("newPlayer", datetime, 1, true);
  49. // Event Params
  50. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  51. // We aren't sending deviceBrand at the moment as deviceModel is sufficient.
  52. // UA1 did not send deviceBrand either. See JIRA-196 for more info.
  53. buf.PushString(deviceModel, "deviceModel"); // Schema: Optional
  54. buf.PushEndEvent();
  55. }
  56. public void GameStarted(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams,
  57. string callingMethodIdentifier, string idLocalProject, string osVersion, bool isTiny, bool debugDevice, string userLocale)
  58. {
  59. buf.PushStartEvent("gameStarted", datetime, 1, true);
  60. // Event Params
  61. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  62. // Schema: Required
  63. buf.PushString(userLocale, "userLocale");
  64. // Schema: Optional
  65. if (!String.IsNullOrEmpty(idLocalProject))
  66. {
  67. buf.PushString(idLocalProject, "idLocalProject");
  68. }
  69. buf.PushString(osVersion, "osVersion");
  70. buf.PushBool(isTiny, "isTiny");
  71. buf.PushBool(debugDevice, "debugDevice");
  72. buf.PushEndEvent();
  73. }
  74. // Keep the enum values in Caps!
  75. // We stringify the values.
  76. // These values aren't listed as an enum the Schema, but they are listed
  77. // values here http://go/UA2_Spreadsheet
  78. internal enum SessionEndState
  79. {
  80. PAUSED,
  81. KILLEDINBACKGROUND,
  82. KILLEDINFOREGROUND,
  83. QUIT,
  84. }
  85. public void GameEnded(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, SessionEndState quitState)
  86. {
  87. buf.PushStartEvent("gameEnded", datetime, 1, true);
  88. // Event Params
  89. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  90. buf.PushString(quitState.ToString(), "sessionEndState"); // Schema: Required
  91. buf.PushEndEvent();
  92. }
  93. public void AdImpression(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, AdImpressionParameters adImpressionParameters)
  94. {
  95. buf.PushStartEvent("adImpression", datetime, 1, true);
  96. // Event Params
  97. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  98. // Schema: Required
  99. buf.PushString(adImpressionParameters.AdCompletionStatus.ToString().ToUpperInvariant(), "adCompletionStatus");
  100. buf.PushString(adImpressionParameters.AdProvider.ToString().ToUpperInvariant(), "adProvider");
  101. buf.PushString(adImpressionParameters.PlacementID, "placementId");
  102. buf.PushString(adImpressionParameters.PlacementName, "placementName");
  103. // Schema: Optional
  104. if (adImpressionParameters.AdEcpmUsd is double adEcpmUsdValue)
  105. {
  106. buf.PushDouble(adEcpmUsdValue, "adEcpmUsd");
  107. }
  108. if (adImpressionParameters.PlacementType != null)
  109. {
  110. buf.PushString(adImpressionParameters.PlacementType.ToString(), "placementType");
  111. }
  112. if (!string.IsNullOrEmpty(adImpressionParameters.SdkVersion))
  113. {
  114. buf.PushString(adImpressionParameters.SdkVersion, "adSdkVersion");
  115. }
  116. if (!string.IsNullOrEmpty(adImpressionParameters.AdImpressionID))
  117. {
  118. buf.PushString(adImpressionParameters.AdImpressionID, "adImpressionID");
  119. }
  120. if (!string.IsNullOrEmpty(adImpressionParameters.AdStoreDstID))
  121. {
  122. buf.PushString(adImpressionParameters.AdStoreDstID, "adStoreDestinationID");
  123. }
  124. if (!string.IsNullOrEmpty(adImpressionParameters.AdMediaType))
  125. {
  126. buf.PushString(adImpressionParameters.AdMediaType, "adMediaType");
  127. }
  128. if (adImpressionParameters.AdTimeWatchedMs is Int64 adTimeWatchedMsValue)
  129. {
  130. buf.PushInt64(adTimeWatchedMsValue, "adTimeWatchedMs");
  131. }
  132. if (adImpressionParameters.AdTimeCloseButtonShownMs is Int64 adTimeCloseButtonShownMsValue)
  133. {
  134. buf.PushInt64(adTimeCloseButtonShownMsValue, "adTimeCloseButtonShownMs");
  135. }
  136. if (adImpressionParameters.AdLengthMs is Int64 adLengthMsValue)
  137. {
  138. buf.PushInt64(adLengthMsValue, "adLengthMs");
  139. }
  140. if (adImpressionParameters.AdHasClicked is bool adHasClickedValue)
  141. {
  142. buf.PushBool(adHasClickedValue, "adHasClicked");
  143. }
  144. if (!string.IsNullOrEmpty(adImpressionParameters.AdSource))
  145. {
  146. buf.PushString(adImpressionParameters.AdSource, "adSource");
  147. }
  148. if (!string.IsNullOrEmpty(adImpressionParameters.AdStatusCallback))
  149. {
  150. buf.PushString(adImpressionParameters.AdStatusCallback, "adStatusCallback");
  151. }
  152. buf.PushEndEvent();
  153. }
  154. public void AcquisitionSource(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, AcquisitionSourceParameters acquisitionSourceParameters)
  155. {
  156. buf.PushStartEvent("acquisitionSource", datetime, 1, true);
  157. // Event Params
  158. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  159. //other event parameters
  160. // Required
  161. buf.PushString(acquisitionSourceParameters.Channel, "acquisitionChannel");
  162. buf.PushString(acquisitionSourceParameters.CampaignId, "acquisitionCampaignId");
  163. buf.PushString(acquisitionSourceParameters.CreativeId, "acquisitionCreativeId");
  164. buf.PushString(acquisitionSourceParameters.CampaignName, "acquisitionCampaignName");
  165. buf.PushString(acquisitionSourceParameters.Provider, "acquisitionProvider");
  166. if (!string.IsNullOrEmpty(acquisitionSourceParameters.CampaignType))
  167. {
  168. buf.PushString(acquisitionSourceParameters.CampaignType, "acquisitionCampaignType");
  169. }
  170. if (!string.IsNullOrEmpty(acquisitionSourceParameters.Network))
  171. {
  172. buf.PushString(acquisitionSourceParameters.Network, "acquisitionNetwork");
  173. }
  174. if (!string.IsNullOrEmpty(acquisitionSourceParameters.CostCurrency))
  175. {
  176. buf.PushString(acquisitionSourceParameters.CostCurrency, "acquisitionCostCurrency");
  177. }
  178. if (acquisitionSourceParameters.Cost is float cost)
  179. {
  180. buf.PushFloat(cost, "acquisitionCost");
  181. }
  182. buf.PushEndEvent();
  183. }
  184. public void Transaction(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, TransactionParameters transactionParameters)
  185. {
  186. buf.PushStartEvent("transaction", datetime, 1, true);
  187. // Event Params
  188. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  189. if (!string.IsNullOrEmpty(SdkVersion.SDK_VERSION))
  190. {
  191. buf.PushString(SdkVersion.SDK_VERSION, "sdkVersion");
  192. }
  193. if (!string.IsNullOrEmpty(transactionParameters.PaymentCountry))
  194. {
  195. buf.PushString(transactionParameters.PaymentCountry, "paymentCountry");
  196. }
  197. if (!string.IsNullOrEmpty(transactionParameters.ProductID))
  198. {
  199. buf.PushString(transactionParameters.ProductID, "productID");
  200. }
  201. if (transactionParameters.RevenueValidated.HasValue)
  202. {
  203. buf.PushInt64(transactionParameters.RevenueValidated.Value, "revenueValidated");
  204. }
  205. if (!string.IsNullOrEmpty(transactionParameters.TransactionID))
  206. {
  207. buf.PushString(transactionParameters.TransactionID, "transactionID");
  208. }
  209. if (!string.IsNullOrEmpty(transactionParameters.TransactionReceipt))
  210. {
  211. buf.PushString(transactionParameters.TransactionReceipt, "transactionReceipt");
  212. }
  213. if (!string.IsNullOrEmpty(transactionParameters.TransactionReceiptSignature))
  214. {
  215. buf.PushString(transactionParameters.TransactionReceiptSignature, "transactionReceiptSignature");
  216. }
  217. if (!string.IsNullOrEmpty(transactionParameters.TransactionServer?.ToString()))
  218. {
  219. buf.PushString(transactionParameters.TransactionServer.ToString(), "transactionServer");
  220. }
  221. if (!string.IsNullOrEmpty(transactionParameters.TransactorID))
  222. {
  223. buf.PushString(transactionParameters.TransactorID, "transactorID");
  224. }
  225. if (!string.IsNullOrEmpty(transactionParameters.StoreItemSkuID))
  226. {
  227. buf.PushString(transactionParameters.StoreItemSkuID, "storeItemSkuID");
  228. }
  229. if (!string.IsNullOrEmpty(transactionParameters.StoreItemID))
  230. {
  231. buf.PushString(transactionParameters.StoreItemID, "storeItemID");
  232. }
  233. if (!string.IsNullOrEmpty(transactionParameters.StoreID))
  234. {
  235. buf.PushString(transactionParameters.StoreID, "storeID");
  236. }
  237. if (!string.IsNullOrEmpty(transactionParameters.StoreSourceID))
  238. {
  239. buf.PushString(transactionParameters.StoreSourceID, "storeSourceID");
  240. }
  241. // Required
  242. buf.PushString(transactionParameters.TransactionName, "transactionName");
  243. buf.PushString(transactionParameters.TransactionType.ToString(), "transactionType");
  244. SetProduct(ref buf, "productsReceived", transactionParameters.ProductsReceived);
  245. SetProduct(ref buf, "productsSpent", transactionParameters.ProductsSpent);
  246. buf.PushEndEvent();
  247. }
  248. public void TransactionFailed(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier, TransactionFailedParameters parameters)
  249. {
  250. buf.PushStartEvent("transactionFailed", datetime, 1, true);
  251. // Event Params
  252. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  253. if (!string.IsNullOrEmpty(SdkVersion.SDK_VERSION))
  254. {
  255. buf.PushString(SdkVersion.SDK_VERSION, "sdkVersion");
  256. }
  257. if (!string.IsNullOrEmpty(parameters.PaymentCountry))
  258. {
  259. buf.PushString(parameters.PaymentCountry, "paymentCountry");
  260. }
  261. if (!string.IsNullOrEmpty(parameters.ProductID))
  262. {
  263. buf.PushString(parameters.ProductID, "productID");
  264. }
  265. if (parameters.RevenueValidated.HasValue)
  266. {
  267. buf.PushInt64(parameters.RevenueValidated.Value, "revenueValidated");
  268. }
  269. if (!string.IsNullOrEmpty(parameters.TransactionID))
  270. {
  271. buf.PushString(parameters.TransactionID, "transactionID");
  272. }
  273. if (!string.IsNullOrEmpty(parameters.TransactionServer?.ToString()))
  274. {
  275. buf.PushString(parameters.TransactionServer.ToString(), "transactionServer");
  276. }
  277. if (parameters.EngagementID != null)
  278. {
  279. buf.PushInt64((long)parameters.EngagementID, "engagementID");
  280. }
  281. if (!string.IsNullOrEmpty(parameters.GameStoreID))
  282. {
  283. buf.PushString(parameters.GameStoreID, "gameStoreID");
  284. }
  285. if (!string.IsNullOrEmpty(parameters.AmazonUserID))
  286. {
  287. buf.PushString(parameters.AmazonUserID, "amazonUserID");
  288. }
  289. if (parameters.IsInitiator != null)
  290. {
  291. buf.PushBool((bool)parameters.IsInitiator, "isInitiator");
  292. }
  293. if (!string.IsNullOrEmpty(parameters.StoreItemSkuID))
  294. {
  295. buf.PushString(parameters.StoreItemSkuID, "storeItemSkuID");
  296. }
  297. if (!string.IsNullOrEmpty(parameters.StoreItemID))
  298. {
  299. buf.PushString(parameters.StoreItemID, "storeItemID");
  300. }
  301. if (!string.IsNullOrEmpty(parameters.StoreID))
  302. {
  303. buf.PushString(parameters.StoreID, "storeID");
  304. }
  305. if (!string.IsNullOrEmpty(parameters.StoreSourceID))
  306. {
  307. buf.PushString(parameters.StoreSourceID, "storeSourceID");
  308. }
  309. // Required
  310. buf.PushString(parameters.TransactionName, "transactionName");
  311. buf.PushString(parameters.TransactionType.ToString(), "transactionType");
  312. SetProduct(ref buf, "productsReceived", parameters.ProductsReceived);
  313. SetProduct(ref buf, "productsSpent", parameters.ProductsSpent);
  314. buf.PushString(parameters.FailureReason, "failureReason");
  315. buf.PushEndEvent();
  316. }
  317. public void ClientDevice(ref Internal.IBuffer buf, DateTime datetime, StdCommonParams commonParams, string callingMethodIdentifier,
  318. string cpuType, string gpuType, Int64 cpuCores, Int64 ramTotal, Int64 screenWidth, Int64 screenHeight, Int64 screenDPI)
  319. {
  320. buf.PushStartEvent("clientDevice", datetime, 1, true);
  321. commonParams.SerializeCommonEventParams(ref buf, callingMethodIdentifier);
  322. // Schema: Optional
  323. buf.PushString(cpuType, "cpuType");
  324. buf.PushString(gpuType, "gpuType");
  325. buf.PushInt64(cpuCores, "cpuCores");
  326. buf.PushInt64(ramTotal, "ramTotal");
  327. buf.PushInt64(screenWidth, "screenWidth");
  328. buf.PushInt64(screenHeight, "screenHeight");
  329. buf.PushInt64(screenDPI, "screenResolution");
  330. buf.PushEndEvent();
  331. }
  332. void SetProduct(ref Internal.IBuffer buf, string productName, Product product)
  333. {
  334. buf.PushObjectStart(productName);
  335. if (product.RealCurrency.HasValue)
  336. {
  337. buf.PushObjectStart("realCurrency");
  338. buf.PushString(product.RealCurrency.Value.RealCurrencyType, "realCurrencyType");
  339. buf.PushInt64(product.RealCurrency.Value.RealCurrencyAmount, "realCurrencyAmount");
  340. buf.PushObjectEnd();
  341. }
  342. if (product.VirtualCurrencies != null && product.VirtualCurrencies.Count != 0)
  343. {
  344. buf.PushArrayStart("virtualCurrencies");
  345. foreach (var virtualCurrency in product.VirtualCurrencies)
  346. {
  347. buf.PushObjectStart();
  348. buf.PushObjectStart("virtualCurrency");
  349. buf.PushString(virtualCurrency.VirtualCurrencyName, "virtualCurrencyName");
  350. buf.PushString(virtualCurrency.VirtualCurrencyType.ToString(), "virtualCurrencyType");
  351. buf.PushInt64(virtualCurrency.VirtualCurrencyAmount, "virtualCurrencyAmount");
  352. buf.PushObjectEnd();
  353. buf.PushObjectEnd();
  354. }
  355. buf.PushArrayEnd();
  356. }
  357. if (product.Items != null && product.Items.Count != 0)
  358. {
  359. buf.PushArrayStart("items");
  360. foreach (var item in product.Items)
  361. {
  362. buf.PushObjectStart();
  363. buf.PushObjectStart("item");
  364. buf.PushString(item.ItemName, "itemName");
  365. buf.PushString(item.ItemType, "itemType");
  366. buf.PushInt64(item.ItemAmount, "itemAmount");
  367. buf.PushObjectEnd();
  368. buf.PushObjectEnd();
  369. }
  370. buf.PushArrayEnd();
  371. }
  372. buf.PushObjectEnd();
  373. }
  374. }
  375. }