public static void Traverse(GameObject obj, string history = null) { Logger.Info($"BRANCH: {history}/{obj.name}"); foreach (Transform child in obj.transform) { Traverse(child.gameObject, history + $"/{obj.name}"); } }
public static void a(ulong userId, string levelId, int difficultyLevel, bool fullCombo, int score, string signed, int playerOptions, int gameOptions, Action <bool> scoreUploadedCallback = null) #endif { //Build score object Score s = new Score(userId.ToString(), levelId, score, difficultyLevel, fullCombo, playerOptions, gameOptions, characteristic, signed); Logger.Info($"Trying to submit score: {levelId} {userId} {difficultyLevel} {score} {fullCombo} {signed}"); JSONObject o = new JSONObject(); o.Add("pb", new JSONString(s.ToBase64())); SharedCoroutineStarter.instance.StartCoroutine(PostCoroutine(o.ToString(), $"{discordCommunityApi}/submit/", scoreUploadedCallback)); }
//Post a score to the server private static IEnumerator PostCoroutine(string data, string address, Action <bool> postCompleteCallback = null) { //TODO: REMOVE. Temp logging in for some players randomly failing to submit score Logger.Info($"Posting: {address} {data}"); UnityWebRequest www = UnityWebRequest.Post(address, data); www.timeout = 30; yield return(www.SendWebRequest()); if (www.isNetworkError || www.isHttpError) { Logger.Error($"{www.responseCode} : {www.error}"); postCompleteCallback?.Invoke(false); } else { postCompleteCallback?.Invoke(true); } }
//Download songs. Taken from BeatSaberMultiplayer //availableSongs: List of IBeatmapLevel which may hold levels already approved for display //downloadQueue: List of beatsaver ids representing songs left to download //completedDownloads: List of beatsaver ids representing songs that have successfully downloaded //songId: The song this instance of the Coroutine is supposed to download //slvc: The song list view controller to display the downloaded songs to private static IEnumerator DownloadSongs(string songHash, SongListViewController slvc) { UnityWebRequest www = UnityWebRequest.Get($"{beatSaverDownloadUrl}{songHash}"); #if BETA Logger.Info($"DOWNLOADING: {beatSaverDownloadUrl}{songHash}"); #endif bool timeout = false; float time = 0f; www.SetRequestHeader("user-agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"); UnityWebRequestAsyncOperation asyncRequest = www.SendWebRequest(); while (!asyncRequest.isDone || asyncRequest.progress < 1f) { yield return(null); time += Time.deltaTime; if (time >= 15f && asyncRequest.progress == 0f) { www.Abort(); timeout = true; } } if (www.isNetworkError || www.isHttpError || timeout) { Logger.Error($"Error downloading song {songHash}: {www.error}"); slvc.ErrorHappened($"Error downloading song {songHash}: {www.error}"); } else { //Logger.Info("Received response from BeatSaver.com..."); string zipPath = ""; string customSongsPath = CustomLevelPathHelper.customLevelsDirectoryPath; string customSongPath = ""; byte[] data = www.downloadHandler.data; try { customSongPath = customSongsPath + "/" + songHash + "/"; zipPath = customSongPath + songHash + ".zip"; if (!Directory.Exists(customSongPath)) { Directory.CreateDirectory(customSongPath); } File.WriteAllBytes(zipPath, data); //Logger.Info("Downloaded zip file!"); } catch (Exception e) { Logger.Error($"Error writing zip: {e}"); slvc.ErrorHappened($"Error writing zip: {e}"); yield break; } //Logger.Info("Extracting..."); try { ZipFile.ExtractToDirectory(zipPath, customSongPath); } catch (Exception e) { Logger.Error($"Unable to extract ZIP! Exception: {e}"); slvc.ErrorHappened($"Unable to extract ZIP! Exception: {e}"); yield break; } try { File.Delete(zipPath); } catch (IOException e) { Logger.Warning($"Unable to delete zip! Exception: {e}"); slvc.ErrorHappened($"Unable to delete zip! Exception: {e}"); yield break; } Logger.Success($"Downloaded!"); } }