Tanoda
UploadLevelObjects.cs
Go to the documentation of this file.
1using System.Collections;
2using System.Collections.Generic;
3using System.Linq;
4using UnityEngine;
6
7public class UploadLevelObjects : MonoBehaviour
8{
10 public UnityEvent onUploaded = new UnityEvent();
11
12 private readonly List<string> filesToDelete = new List<string>();
13
14 private void Awake()
15 {
16 instance = this;
17 }
18
19 public void QueueDelete(string fileName)
20 {
21 filesToDelete.Add(fileName);
22 StartCoroutine(DeleteFile(fileName));
23 }
24
25 private IEnumerator DeleteFile(string filename)
26 {
27 NetworkManager.WSFile[] currentlyUploadedFiles = new NetworkManager.WSFile[] { };
28 yield return NetworkManager.instance.GetAllFilesForThisCourse(files => { currentlyUploadedFiles = files.files; }, Debug.LogError);
29
30 yield return NetworkManager.instance.DeleteFileById(GetFileId(currentlyUploadedFiles, filename), () => { Debug.Log("File delete OK!"); });
31 }
32
33 public IEnumerator UploadAllFiles()
34 {
35 if (Application.internetReachability == NetworkReachability.NotReachable)
36 {
37 PopupManager.instance.ShowPopup("NO_NETWORK", "NO_NETWORK_MESSAGE");
38 yield break;
39 }
40
41
42 var fdd = FindObjectOfType<FileDragAndDrop>();
43 var t = fdd.paretnObject.transform;
44 var allModel = t.GetComponentsInChildren<UploadedFile>(true);
45 var usedFileIDs = new List<int>();
46 NetworkManager.WSFile[] currentlyUploadedFiles = new NetworkManager.WSFile[] { };
47 yield return NetworkManager.instance.GetAllFilesForThisCourse(files => { currentlyUploadedFiles = files.files; }, Debug.LogError);
48 yield return NetworkManager.instance.GetGlobalFiles(files =>
49 {
50 Debug.Log("currentlyUploadedFiles: ");
51 Debug.Log(ToStr(currentlyUploadedFiles));
52 if (currentlyUploadedFiles != null)
53 {
54 Debug.Log("CUF1");
55 var list = currentlyUploadedFiles.ToList();
56 Debug.Log("CUF2");
57 list.AddRange(files.files);
58 Debug.Log("CUF3");
59 currentlyUploadedFiles = list.ToArray();
60 Debug.Log("CUF4!");
61 }
62 else
63 {
64 currentlyUploadedFiles = files.files;
65 }
66 });
67
68 var currentlyUploadedFilesList = currentlyUploadedFiles.ToList();
69
70 // Always delete older gtag
71 //yield return NetworkManager.instance.DeleteFileByName("globalTags.gtag", () => { Debug.Log("File delete OK! (gtag)"); });
72
73 var gtagFile = currentlyUploadedFiles.FirstOrDefault(x => x.fileName == "globalTags.gtag");
74
75 if (gtagFile != default)
76 {
77 var gtagId = currentlyUploadedFiles.First(x => x.fileName == "globalTags.gtag").id;
78
79 yield return NetworkManager.instance.DeleteFileById(gtagId, () => { Debug.Log("File delete OK! (gtag)"); });
80 }
81
82
83 foreach (var f in filesToDelete)
84 {
85 yield return NetworkManager.instance.DeleteFileById(GetFileId(currentlyUploadedFiles, f), () => { Debug.Log($"File delete OK! ({f})"); });
86 currentlyUploadedFilesList = currentlyUploadedFilesList.Where(x => StripPath(x.fileName) != StripPath(f) && StripPath(x.GetFileName()) != StripPath(f)).ToList();
87 }
88
89
90 foreach (var file in allModel)
91 {
92 if (HasThisFileUploaded(currentlyUploadedFilesList.ToArray(), file))
93 {
94 Debug.Log($"File {file.fileName} already uploaded...");
95 //if (file.fileName.EndsWith(".gtag"))
96 //{
97 // yield return NetworkManager.instance.DeleteFileByName(file.fileName, () => { Debug.Log("File delete OK!"); });
98 // continue;
99 //}
100 if (file.fileName.EndsWith(".qiz") || file.fileName.EndsWith(".hlp"))
101 {
102 //yield return NetworkManager.instance.DeleteFileByName(file.fileName, () => { Debug.Log("File delete OK!"); });
103 yield return NetworkManager.instance.DeleteFileById(GetFileId(currentlyUploadedFilesList.ToArray(), file), () => { Debug.Log("File delete OK!"); });
104 yield return NetworkManager.instance.UploadFileToCurrent(file.modelData, file.fileName, false, () => { Debug.Log($"File '{file.fileName}' uploaded!"); }, () => {Debug.LogError($"File '{file.fileName}' FAILED to upload!"); });
105 }
106
107 bool gotadded = false;
108 if (file.global && !FileWasGlobal(currentlyUploadedFilesList, file))
109 {
110 Debug.Log($"Converting local file '{file.fileName}' to global!\n Deleting local file:");
111 yield return NetworkManager.instance.DeleteFileById(GetFileId(currentlyUploadedFilesList.ToArray(), file),
112 () => { Debug.Log("File delete OK!"); });
113 Debug.Log($"Uploading file as global:");
114 yield return NetworkManager.instance.UploadFileToCurrent(file.modelData, file.fileName, true,
115 (x) => { Debug.Log($"File '{file.fileName}' uploaded!"); usedFileIDs.Add(x.id);
116 gotadded = true;
117 },
118 () => { Debug.LogError($"File '{file.fileName}' FAILED to upload!"); });
119 }
120
121 if (!gotadded && file.global && file.gameObject.activeInHierarchy)
122 {
123 usedFileIDs.Add(GetFileId(currentlyUploadedFilesList.ToArray(), file));
124 }
125
126 continue;
127 }
128
129 var skip = false;
130 foreach (var f in filesToDelete)
131 {
132 if (file.fileName == f)
133 {
134 skip = true;
135 break;
136 }
137 }
138
139 if (skip)
140 continue;
141
142 yield return NetworkManager.instance.UploadFileToCurrent(file.modelData, file.fileName, file.global, (x) => { Debug.Log($"File '{file.fileName}' uploaded!"); usedFileIDs.Add(x.id); }, () => {Debug.LogError($"File '{file.fileName}' FAILED to upload!"); });
143 }
144
145 yield return NetworkManager.instance.UploadFileToCurrent(GlobalTagManager.instance.GetData(), "globalTags.gtag", false, () => { Debug.Log("File 'globalTags.gtag' uploaded!"); }, () => {Debug.LogError($"File 'globalTags.gtag' FAILED to upload!"); });
146
147 LoadingManager.instance.HideWindow();
148 if (usedFileIDs.Count > 0)
149 {
150 yield return NetworkManager.instance.SetFilesToCourse(usedFileIDs.ToArray());
151 }
152 PopupManager.instance.ShowPopup("Save Successful", "Course saved successfuly!");
153 }
154
155 private bool HasThisFileUploaded(NetworkManager.WSFile[] files, UploadedFile value)
156 {
157 //if (value.fileName.EndsWith(".qiz") || value.fileName.EndsWith(".hlp"))
158 //{
159 // return false;
160 //}
161 foreach (var wsFile in files)
162 {
163 if (wsFile.fileName == StripPath(value.fileName) || wsFile.GetFileName() == StripPath(value.fileName))
164 {
165 return true;
166 }
167 }
168 return false;
169 }
170
171 private bool FileWasGlobal(List<NetworkManager.WSFile> files, UploadedFile value)
172 {
173 foreach (var wsFile in files)
174 {
175 if (wsFile.fileName == StripPath(value.fileName) || wsFile.GetFileName() == StripPath(value.fileName))
176 {
177 return wsFile.global;
178 }
179 }
180 return value.global;
181 }
182
183 private int GetFileId(NetworkManager.WSFile[] files, UploadedFile value)
184 {
185 foreach (var wsFile in files)
186 {
187 if (wsFile.GetFileName() == StripPath(value.fileName) || wsFile.fileName == StripPath(value.fileName))
188 {
189 return wsFile.id;
190 }
191 }
192 return -1;
193 }
194
195 private int GetFileId(NetworkManager.WSFile[] files, string fileName)
196 {
197 foreach (var wsFile in files)
198 {
199 if (wsFile.GetFileName() == StripPath(fileName) || wsFile.fileName == StripPath(fileName))
200 {
201 return wsFile.id;
202 }
203 }
204 Debug.LogWarning($"File '{fileName}' not found in currentlyUploadedFiles");
205 Debug.LogWarning(ToStr(files));
206 return -1;
207 }
208
209
210 static string ToStr(NetworkManager.WSFile[] a)
211 {
212 var retval = "";
213 foreach (var wsFile in a)
214 {
215 retval += wsFile + "\r\n";
216 }
217
218 return retval;
219 }
220
221 private string StripPath(string fullname)
222 {
223 var retval = fullname;
224 if (retval.IndexOf('\\') != -1)
225 {
226 retval = retval.Remove(0, retval.LastIndexOf('\\') + 1);
227 }
228 if (retval.IndexOf('/') != -1)
229 {
230 retval = retval.Remove(0, retval.LastIndexOf('/') + 1);
231 }
232 return retval;
233 }
234}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
static UploadLevelObjects instance
IEnumerator UploadAllFiles()
void QueueDelete(string fileName)
string fileName
Definition: UploadedFile.cs:8