using System; using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.Analytics; namespace Unity.VisualScripting.Analytics { internal static class MigrationAnalytics { private const int MaxEventsPerHour = 120; private const int MaxNumberOfElements = 1000; private const string VendorKey = "unity.visualscripting"; private const string EventName = "VScriptMigration"; #if !UNITY_2023_2_OR_NEWER private static bool _isRegistered = false; #endif #if UNITY_2023_2_OR_NEWER internal static void Send(Data data) { if (!EditorAnalytics.enabled) return; EditorAnalytics.SendAnalytic(new MigrationAnalytic(data)); } #else internal static void Send(Data data) { if (!EditorAnalytics.enabled) return; if (!RegisterEvent()) return; EditorAnalytics.SendEventWithLimit(EventName, data); } private static bool RegisterEvent() { if (!_isRegistered) { var result = EditorAnalytics.RegisterEventWithLimit(EventName, MaxEventsPerHour, MaxNumberOfElements, VendorKey); if (result == UnityEngine.Analytics.AnalyticsResult.Ok) { _isRegistered = true; } } return _isRegistered; } #endif #if UNITY_2023_2_OR_NEWER [AnalyticInfo(eventName: EventName, vendorKey: VendorKey, maxEventsPerHour:MaxEventsPerHour, maxNumberOfElements:MaxNumberOfElements)] class MigrationAnalytic : IAnalytic { private Data data; public MigrationAnalytic(Data data) { this.data = data; } public bool TryGatherData(out IAnalytic.IData data, out Exception error) { error = null; data = this.data; return data != null; } } [Serializable] internal class Data : IAnalytic.IData #else [Serializable] internal class Data #endif { [SerializeField] internal MigrationStepAnalyticsData total; [SerializeField] internal List steps; } [Serializable] internal class MigrationStepAnalyticsData { [SerializeField] internal string pluginId; [SerializeField] internal string from; [SerializeField] internal string to; [SerializeField] internal bool success; [SerializeField] internal string exception; } } }