using System;
using UnityEditor;
using UnityEngine.Analytics;
namespace Unity.VisualScripting
{
public sealed class UsageAnalytics
{
const int k_MaxEventsPerHour = 1000;
const int k_MaxNumberOfElements = 1000;
const string k_VendorKey = "unity.bolt";
const string k_EventName = "BoltUsage";
#if !UNITY_2023_2_OR_NEWER
static bool isRegistered = false;
#endif
internal static void CollectAndSendForType<T>(string[] paths)
{
if (!EditorAnalytics.enabled || !VSUsageUtility.isVisualScriptingUsed)
return;
foreach (string path in paths)
{
Type assetType = AssetDatabase.GetMainAssetTypeAtPath(path);
if (assetType == typeof(T))
{
CollectAndSend();
return;
}
}
}
#if UNITY_2023_2_OR_NEWER
public static void CollectAndSend()
{
if (!EditorAnalytics.enabled || !VSUsageUtility.isVisualScriptingUsed)
return;
EditorAnalytics.SendAnalytic(new UsageAnalytic(CollectData()));
}
#else
public static void CollectAndSend()
{
if (!EditorAnalytics.enabled || !VSUsageUtility.isVisualScriptingUsed)
return;
if (!RegisterEvent())
return;
var data = CollectData();
EditorAnalytics.SendEventWithLimit(k_EventName, data);
}
private static bool RegisterEvent()
{
if (!isRegistered)
{
var result = EditorAnalytics.RegisterEventWithLimit(k_EventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey);
if (result == UnityEngine.Analytics.AnalyticsResult.Ok)
{
isRegistered = true;
}
}
return isRegistered;
}
#endif
private static UsageAnalyticsData CollectData()
{
var data = new UsageAnalyticsData
{
productVersion = BoltProduct.instance.version.ToString(),
};
return data;
}
#if UNITY_2023_2_OR_NEWER
[AnalyticInfo(eventName: k_EventName, vendorKey: k_VendorKey, maxEventsPerHour:k_MaxEventsPerHour, maxNumberOfElements:k_MaxNumberOfElements)]
class UsageAnalytic : IAnalytic
{
private UsageAnalyticsData data;
public UsageAnalytic(UsageAnalyticsData data)
{
this.data = data;
}
public bool TryGatherData(out IAnalytic.IData data, out Exception error)
{
error = null;
data = this.data;
return data != null;
}
}
private struct UsageAnalyticsData: IAnalytic.IData
#else
private struct UsageAnalyticsData
#endif
{
public string productVersion;
}
}
}