diff --git a/Assets/Scenes/Morgan.unity b/Assets/Scenes/Morgan.unity new file mode 100644 index 0000000..b8d2efd --- /dev/null +++ b/Assets/Scenes/Morgan.unity @@ -0,0 +1,380 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18018535, g: 0.22559482, b: 0.30677685, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &272045951 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 272045953} + - component: {fileID: 272045952} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &272045952 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 272045951} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &272045953 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 272045951} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1330841196 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1330841199} + - component: {fileID: 1330841198} + - component: {fileID: 1330841197} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1330841197 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1330841196} + m_Enabled: 1 +--- !u!20 &1330841198 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1330841196} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1330841199 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1330841196} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1963197093 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1963197096} + - component: {fileID: 1963197095} + - component: {fileID: 1963197094} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1963197094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1963197093} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0735c225bee4c490bbef74cb455fa748, type: 3} + m_Name: + m_EditorClassIdentifier: + promptList: {fileID: 11400000, guid: 21907abc84e40403ca34c4fb9ab30b06, type: 2} + addPrompt: + k__BackingField: 8c52bab5-726b-42d6-bc54-42ed1898a50c + k__BackingField: hello + k__BackingField: coucou +--- !u!114 &1963197095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1963197093} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 153bd176c0ad8f82692512264f5245ba, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1963197096 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1963197093} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1330841199} + - {fileID: 272045953} + - {fileID: 1963197096} diff --git a/Assets/Scenes/Morgan.unity.meta b/Assets/Scenes/Morgan.unity.meta new file mode 100644 index 0000000..9728a19 --- /dev/null +++ b/Assets/Scenes/Morgan.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cf41fd66e55644517b47336ddc1064e0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ScriptableObjects.meta b/Assets/ScriptableObjects.meta new file mode 100644 index 0000000..f7e0e3c --- /dev/null +++ b/Assets/ScriptableObjects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a914fe5634ec428d9a3b33df14b4990 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ScriptableObjects/PromptList.asset b/Assets/ScriptableObjects/PromptList.asset new file mode 100644 index 0000000..b1b69e2 --- /dev/null +++ b/Assets/ScriptableObjects/PromptList.asset @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 381f77917eada4da988bccfb27f6a6a5, type: 3} + m_Name: PromptList + m_EditorClassIdentifier: + prompts: + - k__BackingField: acb689ed-a57a-4463-bb6e-098b4896e930 + k__BackingField: mooi + k__BackingField: moi + - k__BackingField: 9cc1b2c7-3af0-475c-8d25-6f5913b19843 + k__BackingField: lui + k__BackingField: lui + - k__BackingField: 48017744-4552-487a-817a-abd5d03bbbc0 + k__BackingField: elle + k__BackingField: elle diff --git a/Assets/ScriptableObjects/PromptList.asset.meta b/Assets/ScriptableObjects/PromptList.asset.meta new file mode 100644 index 0000000..0b44fbf --- /dev/null +++ b/Assets/ScriptableObjects/PromptList.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 21907abc84e40403ca34c4fb9ab30b06 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/DatabaseClasses/Player.cs b/Assets/Scripts/DatabaseClasses/Player.cs index 3d67c75..853673c 100644 --- a/Assets/Scripts/DatabaseClasses/Player.cs +++ b/Assets/Scripts/DatabaseClasses/Player.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text.RegularExpressions; +[System.Serializable] public class Player { public string name; diff --git a/Assets/Scripts/DatabaseClasses/Prompt.cs b/Assets/Scripts/DatabaseClasses/Prompt.cs index dd483fd..c19c6e2 100644 --- a/Assets/Scripts/DatabaseClasses/Prompt.cs +++ b/Assets/Scripts/DatabaseClasses/Prompt.cs @@ -1,9 +1,21 @@ using System.Collections; using System.Collections.Generic; +using Firebase.Firestore; using UnityEngine; +[System.Serializable, FirestoreData] public class Prompt { - public string id; - public string text; + [field: SerializeField] + [FirestoreDocumentId] + public string id { get; set; } + + [field: SerializeField] + [FirestoreProperty] + public string fr { get; set; } + + [field: SerializeField] + [FirestoreProperty] + public string en { get; set; } + } diff --git a/Assets/Scripts/DatabaseClasses/Proposition.cs b/Assets/Scripts/DatabaseClasses/Proposition.cs index 5e09d06..74d5059 100644 --- a/Assets/Scripts/DatabaseClasses/Proposition.cs +++ b/Assets/Scripts/DatabaseClasses/Proposition.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using UnityEngine; +[System.Serializable] public class Proposition { public string photoUrl; diff --git a/Assets/Scripts/DatabaseClasses/Question.cs b/Assets/Scripts/DatabaseClasses/Question.cs index 8036ea8..5bc2f3e 100644 --- a/Assets/Scripts/DatabaseClasses/Question.cs +++ b/Assets/Scripts/DatabaseClasses/Question.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using UnityEngine; +[System.Serializable] public class Question { public string promptId; diff --git a/Assets/Scripts/DatabaseClasses/Room.cs b/Assets/Scripts/DatabaseClasses/Room.cs index 83f964d..65e124f 100644 --- a/Assets/Scripts/DatabaseClasses/Room.cs +++ b/Assets/Scripts/DatabaseClasses/Room.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; +[System.Serializable] public class Room { public string code; diff --git a/Assets/Scripts/FirebaseInitializer.cs b/Assets/Scripts/FirebaseInitializer.cs index 0f197ed..7c0f931 100644 --- a/Assets/Scripts/FirebaseInitializer.cs +++ b/Assets/Scripts/FirebaseInitializer.cs @@ -2,11 +2,11 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -using UnityEngine.Events; +using System; public class FirebaseInitializer : MonoBehaviour { - public UnityEvent onFirebaseReady; + public Action onFirebaseReady; public static FirebaseInitializer Instance; void Awake() @@ -17,30 +17,47 @@ void Awake() // Start is called before the first frame update void Start() { - Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => + FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => { var dependencyStatus = task.Result; - if (dependencyStatus == Firebase.DependencyStatus.Available) + if (dependencyStatus == DependencyStatus.Available) { // Create and hold a reference to your FirebaseApp, // where app is a Firebase.FirebaseApp property of your application class. - var app = Firebase.FirebaseApp.DefaultInstance; - onFirebaseReady?.Invoke(); + var app = FirebaseApp.DefaultInstance; + Authenticate(); // Set a flag here to indicate whether Firebase is ready to use by your app. } else { - UnityEngine.Debug.LogError(System.String.Format( - "Could not resolve all Firebase dependencies: {0}", dependencyStatus)); - // Firebase Unity SDK is not safe to use here. + Debug.LogError($"Could not resolve all Firebase dependencies: {dependencyStatus}"); } }); } // Update is called once per frame - void Update() + void Authenticate() { + Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance; + auth.SignInAnonymouslyAsync().ContinueWith(task => + { + if (task.IsCanceled) + { + Debug.LogError("SignInAnonymouslyAsync was canceled."); + return; + } + if (task.IsFaulted) + { + Debug.LogError("SignInAnonymouslyAsync encountered an error: " + task.Exception); + return; + } + + Firebase.Auth.AuthResult result = task.Result; + Debug.Log($"User signed in successfully: {result.User.UserId}"); + + onFirebaseReady?.Invoke(); + }); } } diff --git a/Assets/Scripts/PromptList.cs b/Assets/Scripts/PromptList.cs new file mode 100644 index 0000000..5458c89 --- /dev/null +++ b/Assets/Scripts/PromptList.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +[CreateAssetMenu(fileName = "PromptList", menuName = "ScriptableObjects/Prompt List", order = 1)] +public class PromptList : ScriptableObject +{ + public List prompts = new List(); + + + /// + /// Create a new entry with a unique ID + /// + [ContextMenu("Create Entry")] + private void CreateEntry() + { + Prompt temp = new Prompt(); + temp.id = System.Guid.NewGuid().ToString(); + prompts.Add(temp); + } +} diff --git a/Assets/Scripts/PromptList.cs.meta b/Assets/Scripts/PromptList.cs.meta new file mode 100644 index 0000000..6597357 --- /dev/null +++ b/Assets/Scripts/PromptList.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 381f77917eada4da988bccfb27f6a6a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PromptListLoader.cs b/Assets/Scripts/PromptListLoader.cs new file mode 100644 index 0000000..68209eb --- /dev/null +++ b/Assets/Scripts/PromptListLoader.cs @@ -0,0 +1,151 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Firebase.Firestore; +using System; +using Firebase.Extensions; + +/// +/// This class will download or upload the prompts from/to the Firestore +/// +public class PromptListLoader : MonoBehaviour +{ + public PromptList promptList; + + [Header("Enter a prompt here to push it to database")] + public Prompt addPrompt; + + private FirebaseFirestore db; + + + private void Start() + { + FirebaseInitializer.Instance.onFirebaseReady += Initialize; + } + + private void Initialize() + { + FirebaseInitializer.Instance.onFirebaseReady -= Initialize; + db = FirebaseFirestore.DefaultInstance; + } + + /// + /// Will erase your prompt list scriptable object and load everything from firestore + /// + [ContextMenu("Load Prompts From Firestore")] + private void LoadPromptsFromFirestore() + { + if (promptList == null) + { + Debug.LogError("You must provide a prompt list scriptable object", this); + return; + } + + CollectionReference promptsRef = db.Collection("prompts"); + promptsRef.GetSnapshotAsync().ContinueWithOnMainThread(task => + { + QuerySnapshot snapshot = task.Result; + if (snapshot.Count > 0) + { + promptList.prompts.Clear(); + foreach (DocumentSnapshot prompt in snapshot.Documents) + { + Prompt temp = prompt.ConvertTo(); + if (string.IsNullOrEmpty(temp.id)) + { + Debug.LogError("Found a prompt with an empty id. Stopping right here before anything bad happens.", this); + return; + } + promptList.prompts.Add(temp); + } + } + else + { + Debug.LogError("Couldn't get any prompts from Firestore", this); + } + }); + } + + /// + /// Will erase full online database and replace with a new list of prompts + /// + [ContextMenu("Save Prompt list to Firestore")] + private void SavePromptsToFirestore() + { + if (promptList.prompts.Count <= 0) + { + Debug.LogError("your prompt list is empty, I shouldn't save it to the database", this); + return; + } + + EraseFirestore(() => + { + foreach (Prompt p in promptList.prompts) + { + AddPromptToFirestore(p); + } + }); + } + + /// + /// Erase all firestore + /// + /// + [ContextMenu("DELETE ALL Firestore")] + private void EraseFirestore(Action OnCleanComplete) + { + CollectionReference promptCol = db.Collection("prompts"); + promptCol.GetSnapshotAsync().ContinueWithOnMainThread(task => + { + QuerySnapshot snapshot = task.Result; + if (snapshot.Count > 0) + { + foreach (DocumentSnapshot prompt in snapshot.Documents) + { + Debug.Log($"deleting {prompt.Id}"); + prompt.Reference.DeleteAsync(); + } + Debug.Log($"Database fully cleaned"); + OnCleanComplete?.Invoke(); + } + else + { + Debug.LogWarning("Couldn't get any prompts from Firestore (maybe it wa empty)", this); + OnCleanComplete?.Invoke(); + } + }); + } + + /// + /// Will add a prompt to the firestore + /// + [ContextMenu("Add Prompt To Firestore")] + private void AddPromptToFirestore(Prompt _prompt = null) + { + if (_prompt == null) + _prompt = addPrompt; + + DocumentReference newEntry = db.Collection("prompts").Document(); + newEntry.SetAsync(_prompt).ContinueWithOnMainThread(task => + { + if (task.IsCompletedSuccessfully) + { + Debug.Log($"prompt {newEntry.Id} has been added", this); + } + else + { + Debug.LogError($"prompt {newEntry.Id} has not been added {task.Exception.Message}", this); + } + }); + } + + /// + /// + /// + [ContextMenu("Generate Random Id")] + private void GenerateRandomId() + { + addPrompt.id = System.Guid.NewGuid().ToString(); + } +} + diff --git a/Assets/Scripts/PromptListLoader.cs.meta b/Assets/Scripts/PromptListLoader.cs.meta new file mode 100644 index 0000000..c2a6667 --- /dev/null +++ b/Assets/Scripts/PromptListLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0735c225bee4c490bbef74cb455fa748 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: