A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using Unity.Multiplayer.Center.Common;
4using Unity.Multiplayer.Center.Common.Analytics;
5using UnityEditor;
6using UnityEngine;
7using UnityEngine.Analytics;
8
9namespace Unity.Multiplayer.Center.Analytics
10{
11 /// <summary>
12 /// The interface for the Multiplayer Center Analytics provider (only one functional implementation, but the
13 /// interface is needed for testing purposes)
14 /// </summary>
15 internal interface IMultiplayerCenterAnalytics
16 {
17 void SendInstallationEvent(AnswerData data, Preset preset, Package[] packages);
18 void SendRecommendationEvent(AnswerData data, Preset preset);
19 void SendGettingStartedInteractionEvent(string targetPackageId, string sectionId, InteractionDataType type, string displayName);
20 }
21
22 /// <summary>
23 /// The concrete implementation of the multiplayer center analytics provider.
24 /// It convert
25 /// </summary>
26 internal class MultiplayerCenterAnalytics : IMultiplayerCenterAnalytics
27 {
28 const string k_VendorKey = "unity.multiplayer.center";
29 const string k_InstallationEventName = "multiplayer_center_onInstallClicked";
30 const string k_RecommendationEventName = "multiplayer_center_onRecommendation";
31 const string k_GetStartedInteractionEventName = "multiplayer_center_onGetStartedInteraction";
32
33 readonly string m_QuestionnaireVersion;
34 readonly IReadOnlyDictionary<string, string> m_AnswerIdToAnswerName;
35 readonly IReadOnlyDictionary<string, string> m_QuestionIdToQuestionName;
36 readonly string[] m_PresetFullNames = AnalyticsUtils.GetPresetFullNames();
37 string PresetName(Preset v) => m_PresetFullNames[(int)v];
38
39 GameSpec[] FillGameSpecs(AnswerData data)
40 {
41 return AnalyticsUtils.ToGameSpecs(data, m_AnswerIdToAnswerName, m_QuestionIdToQuestionName);
42 }
43
44 protected virtual void SendAnalytic(IAnalytic analytic)
45 {
46 EditorAnalytics.SendAnalytic(analytic);
47 }
48
49 public MultiplayerCenterAnalytics(string questionnaireVersion, IReadOnlyDictionary<string, string> questionDisplayNames,
50 IReadOnlyDictionary<string, string> answerDisplayNames)
51 {
52 m_QuestionnaireVersion = questionnaireVersion;
53 m_QuestionIdToQuestionName = questionDisplayNames;
54 m_AnswerIdToAnswerName = answerDisplayNames;
55 }
56
57 public void SendGettingStartedInteractionEvent(string targetPackageId, string sectionId, InteractionDataType type, string displayName)
58 {
59 var analytic = new GetStartedInteractionEventAnalytic(sectionId, type, displayName, targetPackageId);
60 SendAnalytic(analytic);
61 }
62
63 public void SendInstallationEvent(AnswerData data, Preset preset, Package[] packages)
64 {
65 var analytic = new InstallationEventAnalytic(new InstallData()
66 {
67 Preset = (int)preset,
68 PresetName = PresetName(preset),
69 QuestionnaireVersion = m_QuestionnaireVersion,
70 GamesSpecs = FillGameSpecs(data),
71 Packages = packages
72 });
73 SendAnalytic(analytic);
74 }
75
76 public void SendRecommendationEvent(AnswerData data, Preset preset)
77 {
78 var analytic = new RecommendationEventAnalytic(new RecommendationData()
79 {
80 Preset = (int)preset,
81 PresetName = PresetName(preset),
82 QuestionnaireVersion = m_QuestionnaireVersion,
83 GameSpecs = FillGameSpecs(data)
84 });
85 SendAnalytic(analytic);
86 }
87
88 [AnalyticInfo(eventName: k_InstallationEventName, vendorKey: k_VendorKey)]
89 private class InstallationEventAnalytic : IAnalytic
90 {
91 InstallData m_Data;
92
93 public InstallationEventAnalytic(InstallData data)
94 {
95 m_Data = data;
96 }
97
98 /// <inheritdoc />
99 public bool TryGatherData(out IAnalytic.IData data, out Exception error)
100 {
101 data = m_Data;
102 error = null;
103 return true;
104 }
105 }
106
107 [AnalyticInfo(eventName: k_RecommendationEventName, vendorKey: k_VendorKey)]
108 private class RecommendationEventAnalytic : IAnalytic
109 {
110 RecommendationData m_Data;
111
112 public RecommendationEventAnalytic(RecommendationData data)
113 {
114 m_Data = data;
115 }
116
117 public bool TryGatherData(out IAnalytic.IData data, out Exception error)
118 {
119 data = m_Data;
120 error = null;
121 return true;
122 }
123 }
124
125 [AnalyticInfo(eventName: k_GetStartedInteractionEventName, vendorKey: k_VendorKey)]
126 private class GetStartedInteractionEventAnalytic : IAnalytic
127 {
128 InteractionData m_Data;
129
130 public GetStartedInteractionEventAnalytic(string sectionId, InteractionDataType type, string displayName, string targetPackageId)
131 {
132 m_Data = new InteractionData()
133 {
134 SectionId = sectionId,
135 Type = type,
136 DisplayName = displayName,
137 TargetPackageId = targetPackageId
138 };
139 }
140
141 /// <inheritdoc />
142 public bool TryGatherData(out IAnalytic.IData data, out Exception error)
143 {
144 data = m_Data;
145 error = null;
146 return true;
147 }
148 }
149 }
150}