Documentation for the Unity C# Library
Loading...
Searching...
No Matches
ApexTypes.cs
Go to the documentation of this file.
1using Newtonsoft.Json;
2using Newtonsoft.Json.Linq;
3using System;
4using System.Collections.Generic;
5using System.ComponentModel;
6using System.Runtime.CompilerServices;
7using Unity.Properties;
8using UnityEngine;
9using UnityEngine.UIElements;
10
11
12namespace PixoVR.Apex
13{
14 public interface IPlatformErrorable
15 {
16 public abstract bool HasErrored();
17 }
18
19 public interface IFailure
20 {
21 // Empty so we can check all failure types against this
22 }
23
24 [Serializable]
26 {
27 public string Error;
28 public string HttpCode;
29 public string Message;
30
31 public bool HasErrored()
32 {
33 bool hasErrored = false;
34 bool hasErrorSetup = !(Error == null && Message == null && HttpCode == null);
36 if (hasErrorSetup == false)
37 {
38 if (Error != null)
39 {
40 if (Error.Equals("true", StringComparison.CurrentCultureIgnoreCase))
41 {
42 hasErrored = true;
43 }
44 else
45 {
46 hasErrored = !string.IsNullOrEmpty(Error);
47 }
48 }
49 }
50
51 return hasErrored;
52 }
53 }
54
55 [Serializable]
56 public class JoinSessionResponse : FailureResponse
57 {
58 public JObject Data;
59 public int SessionId;
60
61 public void ParseData()
62 {
63 IEnumerable<JProperty> dataPropertyEnumerator = Data.Properties();
64 foreach (JProperty property in dataPropertyEnumerator)
65 {
66 if (property.Name.Equals("SessionId", StringComparison.OrdinalIgnoreCase))
67 {
68 SessionId = JsonConvert.DeserializeObject<int>(property.Value.ToString());
69 }
70 }
71 }
72 }
74 [Serializable]
76 {
77 public string Error;
78 public string HttpCode;
79 public string Message;
80 public JObject Data;
81 public List<UserModulesData> ParsedData;
82
83 public bool HasErrored()
84 {
85 return (Error.Equals("true", StringComparison.CurrentCultureIgnoreCase));
86 }
87
88 public void ParseData()
89 {
90 ParsedData = new List<UserModulesData>();
91 IEnumerable<JProperty> dataPropertyEnumerator = Data.Properties();
92 UserModulesData currentUser;
93 foreach (JProperty currentProperty in dataPropertyEnumerator)
94 {
95 currentUser = new UserModulesData();
97 currentUser.UserId = currentProperty.Name;
98 currentUser.AvailableModules = JsonConvert.DeserializeObject<List<int>>(
99 currentProperty.Value.ToString()
100 );
102 ParsedData.Add(currentUser);
103 }
104 }
105 }
107 [Serializable]
108 public class UserModulesData
109 {
110 public string UserId;
111 public List<int> AvailableModules;
112
113 public UserModulesData()
114 {
115 AvailableModules = new List<int>();
116 }
117 }
118
119 [Serializable]
120 public class UserModulesRequestData
121 {
122 [JsonProperty(PropertyName = "userIds")]
123 public List<int> UserIds = new List<int>();
124 }
125
126 [Serializable]
127 public class LoginData
128 {
129 public string Login;
130 public string Password;
131
132 public LoginData(string username, string password)
133 {
134 Login = username;
135 Password = password;
136 }
138
139 [Serializable]
141 {
142 public int ID;
143 public int OrgId;
144 public string First;
145 public string Last;
146 public string Email;
147 public string Token;
148 public string Role;
149 public Organization Org;
151
152 public bool HasErrored()
154 return (Email == null || Token == null);
155 }
156
157 public bool IsPlatformSuperadmin()
158 {
159 var isSuperAdmin = !String.IsNullOrEmpty(Role) && Role.Equals("superadmin", StringComparison.CurrentCultureIgnoreCase);
160 var isPlatformOrg = Org != null && !String.IsNullOrEmpty(Org.Type) && Org.Type.Equals("platform", StringComparison.CurrentCultureIgnoreCase);
161 return isPlatformOrg && isSuperAdmin;
162 }
164
165 [Serializable]
167 {
169
170 public bool HasErrored()
171 {
172 return User == null;
173 }
174 }
175
176 [Serializable]
177 public class UserAccessResponseContent : IPlatformErrorable
178 {
179 public int UserId = -1;
180 public int ModuleId = -1;
181 public bool Access;
182 public int? PassingScore;
183
184 public bool HasErrored()
186 return (UserId == -1 || ModuleId == -1);
190 [Serializable]
191 public class Organization
193 public int ID;
194 public string Name;
195 public string Status;
196 public string DownloadRegion;
197 public string Type;
198 public string HubLogoLink;
199 public string PrimaryColor;
200 public string SecondaryColor;
201 }
202
203 [Serializable]
205 {
206 public int ID;
207 public string First;
208 public string Last;
209 public string Email;
210 public string Username;
211
212 public bool HasErrored()
213 {
214 return (Email == null);
215 }
217
218 [Serializable]
220 {
222
223 public bool HasErrored()
224 {
225 return (AssistedLogin == null);
226 }
227 }
228
229 public class AssistedLoginCode
230 {
231 public string AuthCode;
232 public string Expires;
235 [Serializable]
236 public class SessionData
237 {
238 public float Score;
239 public float ScaledScore;
240 public float MinimumScore;
241 public float MaximumScore;
242 public int Duration;
243 public bool Complete;
244 public bool Success;
245
246 public SessionData() { }
247
248 public SessionData(float score, float scaled, float min, float max, int duration, bool completed, bool success)
249 {
250 Score = score;
251 ScaledScore = scaled;
252 MinimumScore = min;
254 Duration = duration;
255 Complete = completed;
256 Success = success;
260#if UNITY_6000_0_OR_NEWER
261 public class OrgModule : ScriptableObject, INotifyBindablePropertyChanged
262#else
263 public class OrgModule : ScriptableObject
264#endif
265 {
266 public int ID = -1;
267 public string Name = "";
268 public string Description = "";
269 public string ShortDescription = "";
270 public string LongDescription = "";
271 public string Industry = "";
272 public string Details = "";
273 public string IconURL = "";
274 public string AvailableLanguages = "";
275 public string Distributor = "";
276 public string UserGuideLink = "";
277 public bool IsAuthenticatedLaunch = false;
278 public bool EnableDebug = false;
279
280 private Texture2D _thumbnail;
281
282 [CreateProperty]
283 public Texture2D Thumbnail
284 {
285 get { return _thumbnail; }
286 set
287 {
288 _thumbnail = value;
289#if UNITY_6000_0_OR_NEWER
290 Notify();
291#endif
292 }
294
295 public List<OrgModuleDownload> Downloads = new List<OrgModuleDownload>();
296 public int? PassingScore = null;
297 public string Categories = "";
298 public string externalId = "";
299 public PlatformPlayer player = null;
300
301#if UNITY_6000_0_OR_NEWER
302 public event EventHandler<BindablePropertyChangedEventArgs> propertyChanged;
303#endif
305 public OrgModule()
306 {
307 Downloads = new List<OrgModuleDownload>();
308 }
309
310 public OrgModule(JToken token)
311 {
312 Downloads = new List<OrgModuleDownload>();
313 Parse(token);
315
316 public void Parse(JToken token)
318 ID = token.Value<int>("ID");
319 Name = token.Value<string>("Name");
320 Description = token.Value<string>("Description");
321 ShortDescription = token.Value<string>("ShortDescription");
322 LongDescription = token.Value<string>("LongDescription");
323 Details = token.Value<string>("Details");
324 IconURL = token.Value<string>("IconURL");
325 PassingScore = token.Value<int?>("PassingScore");
326 Categories = token.Value<string>("Categories");
327 externalId = token.Value<string>("externalId");
328 UserGuideLink = token.Value<string>("UserGuideLink");
329
330 var PlayerToken = token.Value<JObject>("player");
331
332 if (PlayerToken != null)
333 {
334 player = new PlatformPlayer(PlayerToken);
335 }
336
337 var DownloadTokens = token.Value<JArray>("Downloads");
338
339 if (DownloadTokens != null)
340 {
341 foreach (JToken DownloadToken in DownloadTokens)
342 {
343 var downloadData = ScriptableObject.CreateInstance<OrgModuleDownload>();
344 downloadData.Parse(DownloadToken);
345 Downloads.Add(downloadData);
349 var availableLanguages = GetValue<JArray>(token, "availableLanguages");
351 if (availableLanguages != null)
353 var availableLanguagesList = new List<string>();
355 foreach (JToken languageToken in availableLanguages)
357 string displayName = GetValue<string>(languageToken, "displayName");
358 if (!string.IsNullOrEmpty(displayName))
359 {
360 availableLanguagesList.Add(displayName);
362 }
363
364 AvailableLanguages = string.Join(", ", availableLanguagesList);
365 }
366
367 var industry = GetValue<string>(token, "Industry");
368 if (!string.IsNullOrEmpty(industry) && industry.Length > 0)
369 {
370 Industry = char.ToUpper(industry[0]) + (industry.Length > 1 ? industry[1..] : string.Empty);
371 }
372
373 var distributor = GetValue<JToken>(token, "distributor");
374 if (distributor != null)
376 Distributor = GetValue<string>(distributor, "name");
378
379 EnableDebug = token.Value<bool>("enableDebug");
380 IsAuthenticatedLaunch = token.Value<bool>("isAuthenticatedLaunch");
381 }
382
383 private T GetValue<T>(JToken token, string propertyName, T defaultValue = default)
384 {
385 return token[propertyName] != null ? token.Value<T>(propertyName) : defaultValue;
386 }
387
388#if UNITY_6000_0_OR_NEWER
389 void Notify([CallerMemberName] string property = "")
390 {
391 propertyChanged?.Invoke(this, new BindablePropertyChangedEventArgs(property));
392 }
393#endif
395
396 [Serializable]
398 {
399 public int ID;
400 public int VersionID;
401 public string FileLocation;
402 public string Version;
403 public string Platform;
404 public long DownloadSize;
405 public string ApkName;
406 public string URL;
407 public string Status;
408 public string externalId;
409
410 public OrgModuleDownload(JToken token)
411 {
412 Parse(token);
413 }
414
415 public void Parse(JToken token)
416 {
417 ID = token.Value<int>("ID");
418 VersionID = token.Value<int>("VersionID");
419 DownloadSize = token.Value<long>("DownloadSize");
420 externalId = token.Value<string>("externalId");
421 FileLocation = token.Value<string>("FileLocation");
422 Version = token.Value<string>("Version");
423 Platform = token.Value<string>("Platform");
424 ApkName = token.Value<string>("ApkName");
425 URL = token.Value<string>("URL");
426 Status = token.Value<string>("Status");
427 }
428 }
429
430 #region Platform Models
431 [Serializable]
432 public class PlatformPlayer
433 {
434 public int id;
435 public string name;
436 public string description;
437 public int distributorId;
438 public string launchProtocol;
439 public List<PlatformPlayerDownload> versions = new List<PlatformPlayerDownload>();
440
441 public PlatformPlayer(JObject tokenObject)
442 {
443 id = tokenObject.Value<int>("id");
444 distributorId = tokenObject.Value<int>("distributorId");
445 name = tokenObject.Value<string>("name");
446 description = tokenObject.Value<string>("description");
447 launchProtocol = tokenObject.Value<string>("launchProtocol");
448
449 var versionTokens = tokenObject.Value<JArray>("versions");
450 if (versionTokens == null)
451 {
452 versionTokens = new JArray();
453 }
454
455 foreach (JToken Version in versionTokens)
456 {
457 versions.Add(new PlatformPlayerDownload(Version));
458 }
459 }
460 }
462 [Serializable]
463 public class PlatformPlayerDownload
464 {
465 public int id;
466 public string version;
467 public int modulePlayerId;
468 public string status;
469 public string URL;
470 public string ApkName;
471 public string platform;
472
473 public PlatformPlayerDownload(JToken token)
474 {
475 id = token.Value<int>("id");
476 modulePlayerId = token.Value<int>("modulePlayerId");
477 version = token.Value<string>("version");
478 status = token.Value<string>("status");
479 URL = token.Value<string>("URL");
480 ApkName = token.Value<string>("ApkName");
481 platform = token.Value<string>("platform");
482 }
486 [Serializable]
489 public string Token { get; set; }
490 public string Msg { get; set; }
491 public User User { get; set; }
493 public bool HasErrored()
495 return (User == null || string.IsNullOrEmpty(Token));
496 }
497 }
498
499 [Serializable]
500 public class User
501 {
502 public int Id { get; set; }
503 public string CreatedBy { get; set; }
504 public string UpdatedBy { get; set; }
505 public DateTime CreatedAt { get; set; }
506 public DateTime UpdatedAt { get; set; }
507 public string Role { get; set; }
508 public string[] Permissions { get; set; }
509 public string FirstName { get; set; }
510 public string LastName { get; set; }
511 public string Username { get; set; }
512 public string Email { get; set; }
513 public string Phone { get; set; }
514 public string Status { get; set; }
515 public string ExternalId { get; set; }
516 public DateTime PasswordExpDate { get; set; }
517 public Organization Org { get; set; }
518 public int OrgId { get; set; }
519 public DateTime? DeletedAt { get; set; }
520 public string AuthToken { get; set; }
524 [Serializable]
528 public List<QuickIDUser> QuickIDUsers;
529
530 public bool HasErrored()
531 {
532 return QuickIDUsers == null || OrgProperties == null;
533 }
534 }
535
536 public class OrgProperties
537 {
538 public string PrimaryColor;
539 public string SecondaryColor;
540 public string HubLogoURL;
541 public string OrgName;
542
543 public OrgProperties() { }
544 public OrgProperties(string primaryColor, string secondaryColor, string hubLogoURL, string orgName)
545 {
546 PrimaryColor = primaryColor;
547 SecondaryColor = secondaryColor;
548 HubLogoURL = hubLogoURL;
549 OrgName = orgName;
550 }
551 }
552
553 public class QuickIDUser
554 {
555 public string FirstName;
556 public string LastName;
557 public string Username;
558 public string Email;
560 public QuickIDUser() { }
562 public QuickIDUser(string firstName, string lastName, string username, string email)
564 FirstName = firstName;
565 LastName = lastName;
566 Username = username;
567 Email = email;
568 }
569 }
570
571 [Serializable]
572 public class QuickIDLoginData
573 {
574 public string Username;
575 public string SerialNumber;
576
577 public QuickIDLoginData(string serialNumber, string username)
578 {
579 SerialNumber = serialNumber;
580 Username = username;
581 }
582 }
583
584 [Serializable]
585 public class UserMetricsResponse : IFailure, IPlatformErrorable
586 {
587 public List<UserMetric> result;
588 public PageInfo pageInfo;
590 public bool HasErrored()
592 return (result == null || result.Count <= 0);
594 }
596
597 [Serializable]
598 public class PageInfo
599 {
600 public int totalCount;
601 public int page;
602 public int offset;
603 public int pageSize;
604 public int? previousPage;
605 public int? nextPage;
606
607 public int GetLastPageNumber()
609 var lastPage = 1;
610 if (pageSize > 0)
612 lastPage = (int)Math.Ceiling((double)totalCount / pageSize);
614 return lastPage;
618 public enum UserRoles
620 [Description("superadmin")]
622 [Description("admin")]
623 Admin = 1,
624 [Description("manager")]
626 [Description("developer")]
628 [Description("user")]
629 User = 4,
630 [Description("student")]
631 Student = 5,
632 [Description("trial")]
633 Trial = 6
634 }
635
636 [Serializable]
637 public class UserMetric
638 {
639 public int id;
640 public string firstName;
641 public string lastName;
642 public string username;
643 public string email;
644 public string role;
646
647 public DateTime createdAt;
648 public int? orgUnitId;
649 public OrgUnit orgUnit;
650 public int? lastModuleId;
651 public Module lastModule;
652 public int sessionCount;
653 public DateTime? lastActiveAt;
654 public bool isInModule;
655 public string passcode;
657 // =============================
658 // UI Toolkit bindable fields
659 // =============================
661 [SerializeField] private string displayName;
662 [SerializeField] private string usernameEmail;
663 [SerializeField] private string lastActiveDisplay;
664 [SerializeField] private string lastSessionDisplay;
665 [SerializeField] private string createdAtDisplay;
666
667 // =============================
668 // Read-only public accessors
669 // =============================
671 public string DisplayName => displayName;
672 public string UsernameEmail => usernameEmail;
676
678 // =============================
679 // Call when data changes
680 // =============================
681
682 public void RefreshDisplayFields()
683 {
684 // Display name
685 displayName = $"{firstName} {lastName}";
686
687 // Username / email
688 usernameEmail = string.IsNullOrWhiteSpace(email)
689 ? username
690 : $"{username} ({email})";
691
692 // Last active
693 lastActiveDisplay = lastActiveAt.GetLocalFormattedDateTime();
694
695 // Last session
696 if (isInModule)
698 if (lastModule == null)
699 {
700 lastSessionDisplay = "In module...";
701 }
703 {
704 lastSessionDisplay = "In Hub App";
705 }
706 else
707 {
709 $"In module {lastModule.description} ({lastModule.abbreviation}) - {lastActiveAt.GetLocalFormattedDateTime()}";
710 }
711 }
712 else if (lastActiveAt != null)
713 {
715 $"Session Completed - {lastActiveAt.GetLocalFormattedDateTime()}";
717 else
718 {
719 lastSessionDisplay = "No session";
720 }
721
722
723 // Created at
724 createdAtDisplay = createdAt.GetLocalFormattedDateTime();
725 }
726 }
727
728 [Serializable]
729 public class OrgUnit
730 {
731 public int id;
732 public string name;
733 public string externalId;
734 }
735
736 [Serializable]
737 public class Module
739 public int id;
740 public string abbreviation;
741 public string description;
744
745 [Serializable]
746 public class Location
747 {
748 public string city;
749 public string region;
750 public string country;
751 }
752
753 [Serializable]
754 public class Device
755 {
756 public int id;
757 public string name;
758 public string serial;
759 public Location location;
760 public int? batteryLevel;
761 public bool online;
762 public string model;
763 public Module currentApp;
764 public DeviceUser user;
765
766
767
768 // =============================
769 // UI Toolkit bindable fields
770 // =============================
771
772 [SerializeField] private string currentUserDisplay;
773 [SerializeField] private string batteryLevelDisplay;
774 [SerializeField] private string currentModuleDisplay;
775 [SerializeField] private string locationDisplay;
776 [SerializeField] private string currentUsernameEmailDisplay;
777
778
779 public void RefreshDisplayFields()
780 {
781 // Display name
782 if (!online)
786 else
788 currentUserDisplay = "Available";
789 if (user != null)
790 {
792 currentUsernameEmailDisplay = String.IsNullOrWhiteSpace(user.email)
793 ? user.username
794 : $"{user.username} ({user.email})";
799 if (online && currentApp != null)
800 {
801
803 {
804 currentModuleDisplay = "In Hub App";
805 }
806 else
807 {
809 $"In module - ({currentApp.abbreviation}) {currentApp.description}";
810 }
812
813 batteryLevelDisplay = $"{(batteryLevel.HasValue ? batteryLevel.Value.ToString() + "%" : "N/A")}";
814
815 locationDisplay = "Location Unknown";
816 if (location != null)
817 {
818 locationDisplay = $"{location.city}, {location.region}, {location.country}";
820 }
821
822 }
824
825 [Serializable]
826 public class DeviceUser
828 public string fullName;
829 public string email;
830 public string username;
831 }
832
833 [Serializable]
836 public List<Device> result;
838
839 public bool HasErrored()
840 {
841 return (result == null || result.Count <= 0);
842 }
843 }
845
846 public class Session
847 {
848 public int id;
849 public int userId;
850 public int moduleId;
851 public Module module;
852
853 public float? rawScore;
854 public float? maxScore;
855 public float scaledScore;
856 public string status;
857 public string result;
858 public DateTime startedAt;
859 public DateTime? completedAt;
860
861
862 // =============================
863 // UI Toolkit bindable fields
864 // =============================
865
866 [SerializeField] private string sessionModuleDisplay;
867 [SerializeField] private string sessionActiveStatusDisplay;
868
869
870 public void RefreshDisplayFields()
871 {
872 var durationFormatted = GetDurationFormatted();
873 sessionActiveStatusDisplay = String.Format("In Session For {0}", durationFormatted);
874 if (isComplete())
875 {
876 sessionActiveStatusDisplay = String.Format("Completed Session - {0}", durationFormatted);
877 }
878
879 sessionModuleDisplay = module == null ? "Unknown Module" : String.Format("({0}) {1}", module.abbreviation, module.description);
880 if (isComplete())
881 {
882 sessionModuleDisplay = String.Format(
883 "{0} - {1}",
885 completedAt.GetLocalFormattedDateTime()
886 );
887 }
888 }
889
890 public bool isComplete()
891 {
892 return completedAt.HasValue;
893 }
894
895 private string GetDurationFormatted()
896 {
897 var endTime = isComplete() ? completedAt.Value : DateTime.UtcNow;
898 var timeSpan = endTime.Subtract(startedAt);
900 var totalHours = (int)timeSpan.TotalHours;
901 if (totalHours > 0)
902 {
903 return $"{totalHours:D2}:{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}";
904 }
905 return $"{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}";
906 }
907 }
908
909 public class SessionHistoryResponse : IFailure, IPlatformErrorable
910 {
911 public List<Session> result;
912 public PageInfo pageInfo;
913 public bool HasErrored()
915 return (result == null || result.Count <= 0);
916 }
917 }
918
919 public class SessionFilters
920 {
921 public List<int> orgIDs;
922 public List<int> userIDs;
923 }
924 #endregion
925
926
927 public class FilterParams
928 {
929 public string searchText = "";
930 public string sortField;
931 public SortOrder sortOrder = SortOrder.Ascending;
932 public enum SortOrder
934 Ascending,
936 }
937 }
938
939
940
941}
[Serializable]
Definition ApexTypes.cs:944
DeviceUser user
Definition ApexTypes.cs:953
void RefreshDisplayFields()
Definition ApexTypes.cs:986
string batteryLevelDisplay
[SerializeField]
Definition ApexTypes.cs:971
string locationDisplay
[SerializeField]
Definition ApexTypes.cs:979
string currentModuleDisplay
[SerializeField]
Definition ApexTypes.cs:975
string currentUsernameEmailDisplay
[SerializeField]
Definition ApexTypes.cs:983
string currentUserDisplay
[SerializeField]
Definition ApexTypes.cs:967
List< UserModulesData > ParsedData
Definition ApexTypes.cs:99
[Serializable]
Definition ApexTypes.cs:930
[Serializable]
Definition ApexTypes.cs:164
LoginData(string username, string password)
Definition ApexTypes.cs:168
[Serializable]
Definition ApexTypes.cs:912
void Parse(JToken token)
Definition ApexTypes.cs:499
OrgModuleDownload(JToken token)
Definition ApexTypes.cs:494
void Parse(JToken token)
Definition ApexTypes.cs:394
PlatformPlayer player
Definition ApexTypes.cs:377
List< OrgModuleDownload > Downloads
Definition ApexTypes.cs:373
OrgModule(JToken token)
Definition ApexTypes.cs:388
T GetValue< T >(JToken token, string propertyName, T defaultValue=default)
Definition ApexTypes.cs:461
OrgProperties(string primaryColor, string secondaryColor, string hubLogoURL, string orgName)
Definition ApexTypes.cs:661
[Serializable]
Definition ApexTypes.cs:898
[Serializable]
Definition ApexTypes.cs:737
List< PlatformPlayerDownload > versions
Definition ApexTypes.cs:526
PlatformPlayer(JObject tokenObject)
Definition ApexTypes.cs:528
QuickIDLoginData(string serialNumber, string username)
Definition ApexTypes.cs:700
QuickIDUser(string firstName, string lastName, string username, string email)
Definition ApexTypes.cs:679
SessionData(float score, float scaled, float min, float max, int duration, bool completed, bool success)
Definition ApexTypes.cs:326
void RefreshDisplayFields()
string sessionModuleDisplay
[SerializeField]
string GetDurationFormatted()
string sessionActiveStatusDisplay
[SerializeField]
DateTime? completedAt
[Serializable]
Definition ApexTypes.cs:609
DateTime CreatedAt
Definition ApexTypes.cs:613
Organization Org
Definition ApexTypes.cs:625
string[] Permissions
Definition ApexTypes.cs:616
DateTime? DeletedAt
Definition ApexTypes.cs:627
DateTime UpdatedAt
Definition ApexTypes.cs:614
DateTime PasswordExpDate
Definition ApexTypes.cs:624
string createdAtDisplay
[SerializeField]
Definition ApexTypes.cs:827
string lastActiveDisplay
[SerializeField]
Definition ApexTypes.cs:819
string lastSessionDisplay
[SerializeField]
Definition ApexTypes.cs:823
string usernameEmail
[SerializeField]
Definition ApexTypes.cs:815
string displayName
[SerializeField]
Definition ApexTypes.cs:811
List< UserMetric > result
Definition ApexTypes.cs:716