private void _songDetailViewController_favoriteButtonPressed(Song song) { if (PluginConfig.favoriteSongs.Any(x => x.Contains(song.hash))) { PluginConfig.favoriteSongs.Remove(SongDownloader.GetLevelID(song)); PluginConfig.SaveConfig(); _songDetailViewController.SetFavoriteState(false); PlaylistsCollection.RemoveLevelFromPlaylist(PlaylistsCollection.loadedPlaylists.First(x => x.playlistTitle == "Your favorite songs"), SongDownloader.GetLevelID(song)); } else { PluginConfig.favoriteSongs.Add(SongDownloader.GetLevelID(song)); PluginConfig.SaveConfig(); _songDetailViewController.SetFavoriteState(true); PlaylistsCollection.AddSongToPlaylist(PlaylistsCollection.loadedPlaylists.First(x => x.playlistTitle == "Your favorite songs"), new PlaylistSong() { levelId = SongDownloader.GetLevelID(song), songName = song.songName, level = SongDownloader.GetLevel(SongDownloader.GetLevelID(song)), key = song.id }); } }
private IEnumerator VoteWithSteamID(bool upvote) { if (!SteamManager.Initialized) { Plugin.log.Error($"SteamManager is not initialized!"); } _upvoteButton.interactable = false; _downvoteButton.interactable = false; Plugin.log.Info($"Getting a ticket..."); var steamId = SteamUser.GetSteamID(); string authTicketHexString = ""; byte[] authTicket = new byte[1024]; var authTicketResult = SteamUser.GetAuthSessionTicket(authTicket, 1024, out var length); if (authTicketResult != HAuthTicket.Invalid) { var beginAuthSessionResult = SteamUser.BeginAuthSession(authTicket, (int)length, steamId); switch (beginAuthSessionResult) { case EBeginAuthSessionResult.k_EBeginAuthSessionResultOK: var result = SteamUser.UserHasLicenseForApp(steamId, new AppId_t(620980)); SteamUser.EndAuthSession(steamId); switch (result) { case EUserHasLicenseForAppResult.k_EUserHasLicenseResultDoesNotHaveLicense: _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "User does not\nhave license"; yield break; case EUserHasLicenseForAppResult.k_EUserHasLicenseResultHasLicense: if (SteamHelper.m_GetAuthSessionTicketResponse == null) { SteamHelper.m_GetAuthSessionTicketResponse = Callback <GetAuthSessionTicketResponse_t> .Create(OnAuthTicketResponse); } SteamHelper.lastTicket = SteamUser.GetAuthSessionTicket(authTicket, 1024, out length); if (SteamHelper.lastTicket != HAuthTicket.Invalid) { Array.Resize(ref authTicket, (int)length); authTicketHexString = BitConverter.ToString(authTicket).Replace("-", ""); } break; case EUserHasLicenseForAppResult.k_EUserHasLicenseResultNoAuth: _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "User is not\nauthenticated"; yield break; } break; default: _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Auth\nfailed"; yield break; } } Plugin.log.Info("Waiting for Steam callback..."); float startTime = Time.time; yield return(new WaitWhile(() => { return SteamHelper.lastTicketResult != EResult.k_EResultOK && (Time.time - startTime) < 20f; })); if (SteamHelper.lastTicketResult != EResult.k_EResultOK) { Plugin.log.Error($"Auth ticket callback timeout"); _upvoteButton.interactable = true; _downvoteButton.interactable = true; _ratingText.text = "Callback\ntimeout"; yield break; } SteamHelper.lastTicketResult = EResult.k_EResultRevoked; Plugin.log.Info($"Voting..."); Payload payload = new Payload() { steamID = steamId.m_SteamID.ToString(), ticket = authTicketHexString, direction = (upvote ? 1 : -1) }; string json = JsonUtility.ToJson(payload); Plugin.log.Info(json); UnityWebRequest voteWWW = UnityWebRequest.Post($"{PluginConfig.beatsaverURL}/api/vote/steam/{_lastBeatSaverSong.key}", json); byte[] jsonBytes = new System.Text.UTF8Encoding().GetBytes(json); voteWWW.uploadHandler = new UploadHandlerRaw(jsonBytes); voteWWW.SetRequestHeader("Content-Type", "application/json"); voteWWW.timeout = 30; yield return(voteWWW.SendWebRequest()); if (voteWWW.isNetworkError) { Plugin.log.Error(voteWWW.error); _ratingText.text = voteWWW.error; } else { if (!_firstVote) { yield return(new WaitForSecondsRealtime(2f)); } _firstVote = false; if (voteWWW.responseCode >= 200 && voteWWW.responseCode <= 299) { // Plugin.log.Info(voteWWW.downloadHandler.text); JObject node = JObject.Parse(voteWWW.downloadHandler.text); // Plugin.log.Info(((int)node["stats"]["upVotes"]).ToString() + " -- " + ((int)(node["stats"]["downVotes"])).ToString()); _ratingText.text = (((int)node["stats"]["upVotes"]) - ((int)node["stats"]["downVotes"])).ToString(); if (upvote) { _upvoteButton.interactable = false; _downvoteButton.interactable = true; } else { _downvoteButton.interactable = false; _upvoteButton.interactable = true; } string lastlevelHash = SongCore.Utilities.Hashing.GetCustomLevelHash(_lastLevel as CustomPreviewBeatmapLevel).ToLower(); if (!PluginConfig.votedSongs.ContainsKey(lastlevelHash)) { PluginConfig.votedSongs.Add(lastlevelHash, new SongVote(_lastBeatSaverSong.key, upvote ? VoteType.Upvote : VoteType.Downvote)); PluginConfig.SaveConfig(); } else if (PluginConfig.votedSongs[lastlevelHash].voteType != (upvote ? VoteType.Upvote : VoteType.Downvote)) { PluginConfig.votedSongs[lastlevelHash] = new SongVote(_lastBeatSaverSong.key, upvote ? VoteType.Upvote : VoteType.Downvote); PluginConfig.SaveConfig(); } } else { switch (voteWWW.responseCode) { case 500: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Server \nerror"; Plugin.log.Error("Error: " + voteWWW.downloadHandler.text); }; break; case 401: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Invalid\nauth ticket"; Plugin.log.Error("Error: " + voteWWW.downloadHandler.text); }; break; case 404: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Beatmap not\found"; Plugin.log.Error("Error: " + voteWWW.downloadHandler.text); }; break; case 400: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Bad\nrequest"; Plugin.log.Error("Error: " + voteWWW.downloadHandler.text); }; break; default: { _upvoteButton.interactable = true; _downvoteButton.interactable = true; _ratingText.text = "Error\n" + voteWWW.responseCode; Plugin.log.Error("Error: " + voteWWW.downloadHandler.text); }; break; } } } }
private IEnumerator SetupUI() { if (initialized) { yield break; } var downloaderSubMenu = SettingsUI.CreateSubMenu("Downloader"); var disableDeleteButton = downloaderSubMenu.AddBool("Disable delete button"); disableDeleteButton.GetValue += delegate { return(PluginConfig.disableDeleteButton); }; disableDeleteButton.SetValue += delegate(bool value) { PluginConfig.disableDeleteButton = value; PluginConfig.SaveConfig(); }; var deleteToRecycleBin = downloaderSubMenu.AddBool("Delete to Recycle Bin"); deleteToRecycleBin.GetValue += delegate { return(PluginConfig.deleteToRecycleBin); }; deleteToRecycleBin.SetValue += delegate(bool value) { PluginConfig.deleteToRecycleBin = value; PluginConfig.SaveConfig(); }; var enableSongIcons = downloaderSubMenu.AddBool("Enable additional song icons"); enableSongIcons.GetValue += delegate { return(PluginConfig.enableSongIcons); }; enableSongIcons.SetValue += delegate(bool value) { PluginConfig.enableSongIcons = value; PluginConfig.SaveConfig(); }; var rememberLastPackAndSong = downloaderSubMenu.AddBool("Remember last pack and song"); rememberLastPackAndSong.GetValue += delegate { return(PluginConfig.rememberLastPackAndSong); }; rememberLastPackAndSong.SetValue += delegate(bool value) { PluginConfig.rememberLastPackAndSong = value; PluginConfig.SaveConfig(); }; var maxSimultaneousDownloads = downloaderSubMenu.AddInt("Max simultaneous downloads", 1, 10, 1); maxSimultaneousDownloads.GetValue += delegate { return(PluginConfig.maxSimultaneousDownloads); }; maxSimultaneousDownloads.SetValue += delegate(int value) { PluginConfig.maxSimultaneousDownloads = value; PluginConfig.SaveConfig(); }; var fastScrollSpeed = downloaderSubMenu.AddInt("Fast scroll speed", 2, 20, 1); fastScrollSpeed.GetValue += delegate { return(PluginConfig.fastScrollSpeed); }; fastScrollSpeed.SetValue += delegate(int value) { PluginConfig.fastScrollSpeed = value; PluginConfig.SaveConfig(); }; _moreSongsButton = MenuButtonUI.AddButton("More songs", "Download more songs from BeatSaver.com!", BeatSaverButtonPressed); _moreSongsButton.interactable = SongLoader.AreSongsLoaded; MenuButtonUI.AddButton("More playlists", PlaylistsButtonPressed); yield return(null); initialized = true; }
private IEnumerator VoteWithAccessToken(bool upvote) { Plugin.log.Info($"Voting..."); _upvoteButton.interactable = false; _downvoteButton.interactable = false; UnityWebRequest voteWWW = UnityWebRequest.Get($"{PluginConfig.beatsaverURL}/api/vote/user/{_lastBeatSaverSong.key}/{(upvote ? 1 : -1)}/{PluginConfig.apiAccessToken}"); voteWWW.timeout = 30; yield return(voteWWW.SendWebRequest()); if (voteWWW.isNetworkError) { Plugin.log.Error(voteWWW.error); _ratingText.text = voteWWW.error; } else { if (!_firstVote) { yield return(new WaitForSecondsRealtime(3f)); } _firstVote = false; switch (voteWWW.responseCode) { case 200: { JSONNode node = JSON.Parse(voteWWW.downloadHandler.text); _ratingText.text = (int.Parse(node["upVotes"]) - int.Parse(node["downVotes"])).ToString(); if (upvote) { _upvoteButton.interactable = false; _downvoteButton.interactable = true; } else { _downvoteButton.interactable = false; _upvoteButton.interactable = true; } string lastlevelHash = SongCore.Utilities.Hashing.GetCustomLevelHash(_lastLevel as CustomPreviewBeatmapLevel).ToLower(); if (!PluginConfig.votedSongs.ContainsKey(lastlevelHash)) { PluginConfig.votedSongs.Add(lastlevelHash, new SongVote(_lastBeatSaverSong.key, upvote ? VoteType.Upvote : VoteType.Downvote)); PluginConfig.SaveConfig(); } else if (PluginConfig.votedSongs[lastlevelHash].voteType != (upvote ? VoteType.Upvote : VoteType.Downvote)) { PluginConfig.votedSongs[lastlevelHash] = new SongVote(_lastBeatSaverSong.key, upvote ? VoteType.Upvote : VoteType.Downvote); PluginConfig.SaveConfig(); } }; break; case 403: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Read-only\ntoken"; }; break; case 401: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Token\nnot found"; }; break; case 400: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Bad\ntoken"; }; break; default: { _upvoteButton.interactable = true; _downvoteButton.interactable = true; _ratingText.text = "Error\n" + voteWWW.responseCode; }; break; } } }
private IEnumerator VoteWithAccessToken(bool upvote) { Logger.Log($"Voting..."); _upvoteButton.interactable = false; _downvoteButton.interactable = false; UnityWebRequest voteWWW = UnityWebRequest.Get($"{PluginConfig.beatsaverURL}/api/songs/vote/{_lastBeatSaverSong.id}/{(upvote ? 1 : 0)}/{PluginConfig.apiAccessToken}"); voteWWW.timeout = 30; yield return(voteWWW.SendWebRequest()); if (voteWWW.isNetworkError) { Logger.Error(voteWWW.error); _ratingText.text = voteWWW.error; } else { if (!_firstVote) { yield return(new WaitForSecondsRealtime(3f)); } _firstVote = false; switch (voteWWW.responseCode) { case 200: { JSONNode node = JSON.Parse(voteWWW.downloadHandler.text); _ratingText.text = (int.Parse(node["upVotes"]) - int.Parse(node["downVotes"])).ToString(); if (upvote) { _upvoteButton.interactable = false; _downvoteButton.interactable = true; } else { _downvoteButton.interactable = false; _upvoteButton.interactable = true; } if (!PluginConfig.votedSongs.ContainsKey(_lastLevel.levelID.Substring(0, 32))) { PluginConfig.votedSongs.Add(_lastLevel.levelID.Substring(0, 32), new SongVote(_lastBeatSaverSong.id, upvote ? VoteType.Upvote : VoteType.Downvote)); PluginConfig.SaveConfig(); } else if (PluginConfig.votedSongs[_lastLevel.levelID.Substring(0, 32)].voteType != (upvote ? VoteType.Upvote : VoteType.Downvote)) { PluginConfig.votedSongs[_lastLevel.levelID.Substring(0, 32)] = new SongVote(_lastBeatSaverSong.id, upvote ? VoteType.Upvote : VoteType.Downvote); PluginConfig.SaveConfig(); } }; break; case 403: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Read-only\ntoken"; }; break; case 401: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Token\nnot found"; }; break; case 400: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Bad\ntoken"; }; break; default: { _upvoteButton.interactable = true; _downvoteButton.interactable = true; _ratingText.text = "Error\n" + voteWWW.responseCode; }; break; } } }
private IEnumerator VoteWithSteamID(bool upvote) { if (!SteamManager.Initialized) { Logger.Error($"SteamManager is not initialized!"); } _upvoteButton.interactable = false; _downvoteButton.interactable = false; Logger.Log($"Getting a ticket..."); var steamId = SteamUser.GetSteamID(); string authTicketHexString = ""; byte[] authTicket = new byte[1024]; var authTicketResult = SteamUser.GetAuthSessionTicket(authTicket, 1024, out var length); if (authTicketResult != HAuthTicket.Invalid) { var beginAuthSessionResult = SteamUser.BeginAuthSession(authTicket, (int)length, steamId); switch (beginAuthSessionResult) { case EBeginAuthSessionResult.k_EBeginAuthSessionResultOK: var result = SteamUser.UserHasLicenseForApp(steamId, new AppId_t(620980)); SteamUser.EndAuthSession(steamId); switch (result) { case EUserHasLicenseForAppResult.k_EUserHasLicenseResultDoesNotHaveLicense: _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "User does not\nhave license"; yield break; case EUserHasLicenseForAppResult.k_EUserHasLicenseResultHasLicense: if (SteamHelper.m_GetAuthSessionTicketResponse == null) { SteamHelper.m_GetAuthSessionTicketResponse = Callback <GetAuthSessionTicketResponse_t> .Create(OnAuthTicketResponse); } SteamHelper.lastTicket = SteamUser.GetAuthSessionTicket(authTicket, 1024, out length); if (SteamHelper.lastTicket != HAuthTicket.Invalid) { Array.Resize(ref authTicket, (int)length); authTicketHexString = BitConverter.ToString(authTicket).Replace("-", ""); } break; case EUserHasLicenseForAppResult.k_EUserHasLicenseResultNoAuth: _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "User is not\nauthenticated"; yield break; } break; default: _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Auth\nfailed"; yield break; } } Logger.Log("Waiting for Steam callback..."); float startTime = Time.time; yield return(new WaitWhile(() => { return SteamHelper.lastTicketResult != EResult.k_EResultOK && (Time.time - startTime) < 20f; })); if (SteamHelper.lastTicketResult != EResult.k_EResultOK) { Logger.Error($"Auth ticket callback timeout"); _upvoteButton.interactable = true; _downvoteButton.interactable = true; _ratingText.text = "Callback\ntimeout"; yield break; } SteamHelper.lastTicketResult = EResult.k_EResultRevoked; Logger.Log($"Voting..."); Dictionary <string, string> formData = new Dictionary <string, string> (); formData.Add("id", steamId.m_SteamID.ToString()); formData.Add("ticket", authTicketHexString); UnityWebRequest voteWWW = UnityWebRequest.Post($"{PluginConfig.beatsaverURL}/api/songs/voteById/{_lastBeatSaverSong.id}/{(upvote ? 1 : 0)}", formData); voteWWW.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded"); voteWWW.timeout = 30; yield return(voteWWW.SendWebRequest()); if (voteWWW.isNetworkError) { Logger.Error(voteWWW.error); _ratingText.text = voteWWW.error; } else { if (!_firstVote) { yield return(new WaitForSecondsRealtime(2f)); } _firstVote = false; switch (voteWWW.responseCode) { case 200: { JSONNode node = JSON.Parse(voteWWW.downloadHandler.text); _ratingText.text = (int.Parse(node["upVotes"]) - int.Parse(node["downVotes"])).ToString(); if (upvote) { _upvoteButton.interactable = false; _downvoteButton.interactable = true; } else { _downvoteButton.interactable = false; _upvoteButton.interactable = true; } if (!PluginConfig.votedSongs.ContainsKey(_lastLevel.levelID.Substring(0, 32))) { PluginConfig.votedSongs.Add(_lastLevel.levelID.Substring(0, 32), new SongVote(_lastBeatSaverSong.id, upvote ? VoteType.Upvote : VoteType.Downvote)); PluginConfig.SaveConfig(); } else if (PluginConfig.votedSongs[_lastLevel.levelID.Substring(0, 32)].voteType != (upvote ? VoteType.Upvote : VoteType.Downvote)) { PluginConfig.votedSongs[_lastLevel.levelID.Substring(0, 32)] = new SongVote(_lastBeatSaverSong.id, upvote ? VoteType.Upvote : VoteType.Downvote); PluginConfig.SaveConfig(); } }; break; case 500: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Steam API\nerror"; Logger.Error("Error: " + voteWWW.downloadHandler.text); }; break; case 401: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Invalid\nauth ticket"; Logger.Error("Error: " + voteWWW.downloadHandler.text); }; break; case 403: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Steam ID\nmismatch"; Logger.Error("Error: " + voteWWW.downloadHandler.text); }; break; case 400: { _upvoteButton.interactable = false; _downvoteButton.interactable = false; _ratingText.text = "Bad\nrequest"; Logger.Error("Error: " + voteWWW.downloadHandler.text); }; break; default: { _upvoteButton.interactable = true; _downvoteButton.interactable = true; _ratingText.text = "Error\n" + voteWWW.responseCode; Logger.Error("Error: " + voteWWW.downloadHandler.text); }; break; } } }
private void SetupTweaks() { if (initialized || PluginConfig.disableSongListTweaks) { return; } Logger.Log("Setting up song list tweaks..."); _playlistsFlowCoordinator = (new GameObject("PlaylistsFlowCoordinator")).AddComponent <PlaylistsFlowCoordinator>(); _playlistsFlowCoordinator.didFinishEvent += _playlistsFlowCoordinator_didFinishEvent; _beatmapCharacteristics = Resources.FindObjectsOfTypeAll <BeatmapCharacteristicSO>(); _lastCharacteristic = _beatmapCharacteristics.First(x => x.characteristicName == "Standard"); Resources.FindObjectsOfTypeAll <BeatmapCharacteristicSelectionViewController>().First().didSelectBeatmapCharacteristicEvent += (BeatmapCharacteristicSelectionViewController sender, BeatmapCharacteristicSO selected) => { _lastCharacteristic = selected; }; if (SongLoader.AreSongsLoaded) { _levelCollection = SongLoader.CustomLevelCollectionSO; } else { SongLoader.SongsLoadedEvent += (SongLoader sender, List <CustomLevel> levels) => { _levelCollection = SongLoader.CustomLevelCollectionSO; }; } _mainFlowCoordinator = Resources.FindObjectsOfTypeAll <MainFlowCoordinator>().FirstOrDefault(); _mainFlowCoordinator.GetPrivateField <MainMenuViewController>("_mainMenuViewController").didFinishEvent += SongListTweaks_didFinishEvent; _simpleDialog = ReflectionUtil.GetPrivateField <SimpleDialogPromptViewController>(_mainFlowCoordinator, "_simpleDialogPromptViewController"); _simpleDialog = Instantiate(_simpleDialog.gameObject, _simpleDialog.transform.parent).GetComponent <SimpleDialogPromptViewController>(); _difficultyViewController = Resources.FindObjectsOfTypeAll <BeatmapDifficultyViewController>().FirstOrDefault(); _difficultyViewController.didSelectDifficultyEvent += _difficultyViewController_didSelectDifficultyEvent; _levelListViewController = Resources.FindObjectsOfTypeAll <LevelListViewController>().FirstOrDefault(); _levelListViewController.didSelectLevelEvent += _levelListViewController_didSelectLevelEvent;; RectTransform _tableViewRectTransform = _levelListViewController.GetComponentsInChildren <RectTransform>().First(x => x.name == "TableViewContainer"); _tableViewRectTransform.sizeDelta = new Vector2(0f, -20f); _tableViewRectTransform.anchoredPosition = new Vector2(0f, -2.5f); RectTransform _pageUp = _tableViewRectTransform.GetComponentsInChildren <RectTransform>(true).First(x => x.name == "PageUpButton"); _pageUp.anchoredPosition = new Vector2(0f, -1f); RectTransform _pageDown = _tableViewRectTransform.GetComponentsInChildren <RectTransform>(true).First(x => x.name == "PageDownButton"); _pageDown.anchoredPosition = new Vector2(0f, 1f); _searchButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(-20f, 36.25f), new Vector2(20f, 6f), SearchPressed, "Search"); _searchButton.SetButtonTextSize(3f); _searchButton.ToggleWordWrapping(false); _sortByButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(0f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.SortBy); }, "Sort By"); _sortByButton.SetButtonTextSize(3f); _sortByButton.ToggleWordWrapping(false); _playlistsButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(20f, 36.25f), new Vector2(20f, 6f), PlaylistsButtonPressed, "Playlists"); _playlistsButton.SetButtonTextSize(3f); _playlistsButton.ToggleWordWrapping(false); _defButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(-20f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.Select); SetLevels(_lastCharacteristic, SortMode.Default, ""); }, "Default"); _defButton.SetButtonTextSize(3f); _defButton.ToggleWordWrapping(false); _defButton.gameObject.SetActive(false); _newButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(0f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.Select); SetLevels(_lastCharacteristic, SortMode.Newest, ""); }, "Newest"); _newButton.SetButtonTextSize(3f); _newButton.ToggleWordWrapping(false); _newButton.gameObject.SetActive(false); _authorButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(20f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.Select); SetLevels(_lastCharacteristic, SortMode.Difficulty, ""); }, "Difficulty"); _authorButton.SetButtonTextSize(3f); _authorButton.ToggleWordWrapping(false); _authorButton.gameObject.SetActive(false); _detailViewController = Resources.FindObjectsOfTypeAll <StandardLevelDetailViewController>().First(x => x.name == "StandardLevelDetailViewController"); RectTransform buttonsRect = _detailViewController.GetComponentsInChildren <RectTransform>().First(x => x.name == "Buttons"); buttonsRect.anchoredPosition = new Vector2(0f, 10.75f); RectTransform customButtonsRect = Instantiate(buttonsRect, buttonsRect.parent, true); Destroy(customButtonsRect.GetComponent <ContentSizeFitter>()); Destroy(customButtonsRect.GetComponent <HorizontalLayoutGroup>()); customButtonsRect.name = "CustomUIButtonsHolder"; customButtonsRect.anchoredPosition = new Vector2(0f, 1.25f); _favoriteButton = customButtonsRect.GetComponentsInChildren <Button>().First(x => x.name == "PracticeButton"); _favoriteButton.SetButtonIcon(Base64Sprites.AddToFavorites); _favoriteButton.onClick.AddListener(() => { if (PluginConfig.favoriteSongs.Any(x => x.Contains(_detailViewController.difficultyBeatmap.level.levelID))) { PluginConfig.favoriteSongs.Remove(_detailViewController.difficultyBeatmap.level.levelID); PluginConfig.SaveConfig(); _favoriteButton.SetButtonIcon(Base64Sprites.AddToFavorites); PlaylistsCollection.RemoveLevelFromPlaylist(PlaylistsCollection.loadedPlaylists.First(x => x.playlistTitle == "Your favorite songs"), _detailViewController.difficultyBeatmap.level.levelID); } else { PluginConfig.favoriteSongs.Add(_detailViewController.difficultyBeatmap.level.levelID); PluginConfig.SaveConfig(); _favoriteButton.SetButtonIcon(Base64Sprites.RemoveFromFavorites); PlaylistsCollection.AddSongToPlaylist(PlaylistsCollection.loadedPlaylists.First(x => x.playlistTitle == "Your favorite songs"), new PlaylistSong() { levelId = _detailViewController.difficultyBeatmap.level.levelID, songName = _detailViewController.difficultyBeatmap.level.songName, level = SongDownloader.GetLevel(_detailViewController.difficultyBeatmap.level.levelID) }); } }); _deleteButton = customButtonsRect.GetComponentsInChildren <Button>().First(x => x.name == "PlayButton"); _deleteButton.SetButtonText("Delete"); _deleteButton.ToggleWordWrapping(false); _deleteButton.onClick.AddListener(DeletePressed); _deleteButton.GetComponentsInChildren <RectTransform>().First(x => x.name == "GlowContainer").gameObject.SetActive(false); _deleteButton.interactable = !PluginConfig.disableDeleteButton; //based on https://github.com/halsafar/BeatSaberSongBrowser/blob/master/SongBrowserPlugin/UI/Browser/SongBrowserUI.cs#L192 var statsPanel = _detailViewController.GetComponentsInChildren <CanvasRenderer>(true).First(x => x.name == "LevelParamsPanel"); var statTransforms = statsPanel.GetComponentsInChildren <RectTransform>(); var valueTexts = statsPanel.GetComponentsInChildren <TextMeshProUGUI>().Where(x => x.name == "ValueText").ToList(); foreach (RectTransform r in statTransforms) { if (r.name == "Separator") { continue; } r.sizeDelta = new Vector2(r.sizeDelta.x * 0.85f, r.sizeDelta.y * 0.85f); } var _starStatTransform = Instantiate(statTransforms[1], statsPanel.transform, false); _starStatText = _starStatTransform.GetComponentInChildren <TextMeshProUGUI>(); _starStatTransform.GetComponentInChildren <UnityEngine.UI.Image>().sprite = Base64Sprites.StarFull; _starStatText.text = "--"; initialized = true; }
public void OnApplicationQuit() { PluginConfig.SaveConfig(); }
public IEnumerator PostReview(float funFactor, float rhythm, float flow, float patternQuality, float readability, float levelQuality) { yield return(null); BeastSaberReview review = new BeastSaberReview(GetUserInfo.GetUserName(), funFactor, rhythm, flow, patternQuality, readability, levelQuality); _reviewViewController.SetSubmitButtonState(true, false); _reviewViewController.SetStatusText(false, ""); UnityWebRequest voteWWW = new UnityWebRequest($"https://bsaber.com/wp-json/bsaber-api/songs/{songkey}/reviews"); voteWWW.method = "POST"; voteWWW.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(JsonUtility.ToJson(review))); voteWWW.downloadHandler = new DownloadHandlerBuffer(); voteWWW.SetRequestHeader("Content-Type", "application/json"); voteWWW.timeout = 30; yield return(voteWWW.SendWebRequest()); if (voteWWW.isNetworkError) { Misc.Logger.Error(voteWWW.error); _reviewViewController.SetSubmitButtonState(true, true); _reviewViewController.SetStatusText(false, ""); } else { switch (voteWWW.responseCode) { case 200: { JSONNode node = JSON.Parse(voteWWW.downloadHandler.text); if (node["success"]) { Misc.Logger.Log("Success!"); if (!PluginConfig.reviewedSongs.ContainsKey(levelId.Substring(0, 32))) { PluginConfig.reviewedSongs.Add(levelId.Substring(0, 32), new SongReview(songkey, funFactor, rhythm, flow, patternQuality, readability, levelQuality)); PluginConfig.SaveConfig(); } else { PluginConfig.reviewedSongs[levelId.Substring(0, 32)] = new SongReview(songkey, funFactor, rhythm, flow, patternQuality, readability, levelQuality); PluginConfig.SaveConfig(); } _reviewViewController.SetSubmitButtonState(false, false); _reviewViewController.SetStatusText(true, "<color=green>Success!"); } else { Misc.Logger.Error("Something went wrong...\n Response: " + voteWWW.downloadHandler.text); _reviewViewController.SetSubmitButtonState(true, true); _reviewViewController.SetStatusText(false, ""); } }; break; default: { Misc.Logger.Error("Error: " + voteWWW.responseCode + "\nResponse: " + voteWWW.downloadHandler.text); _reviewViewController.SetSubmitButtonState(true, true); _reviewViewController.SetStatusText(false, ""); }; break; } } }
public void OnApplicationQuit() { SceneManager.activeSceneChanged -= SceneManagerOnActiveSceneChanged; SceneManager.sceneLoaded -= SceneManager_sceneLoaded; PluginConfig.SaveConfig(); }
private IEnumerator SetupUI() { if (initialized) { yield break; } RectTransform mainMenu = (Resources.FindObjectsOfTypeAll <MainMenuViewController>().First().rectTransform); var downloaderSubMenu = SettingsUI.CreateSubMenu("Downloader"); var disableDeleteButton = downloaderSubMenu.AddBool("Disable delete button"); disableDeleteButton.GetValue += delegate { return(PluginConfig.disableDeleteButton); }; disableDeleteButton.SetValue += delegate(bool value) { PluginConfig.disableDeleteButton = value; PluginConfig.SaveConfig(); }; var deleteToRecycleBin = downloaderSubMenu.AddBool("Delete to Recycle Bin"); deleteToRecycleBin.GetValue += delegate { return(PluginConfig.deleteToRecycleBin); }; deleteToRecycleBin.SetValue += delegate(bool value) { PluginConfig.deleteToRecycleBin = value; PluginConfig.SaveConfig(); }; var enableSongIcons = downloaderSubMenu.AddBool("Enable additional song icons"); enableSongIcons.GetValue += delegate { return(PluginConfig.enableSongIcons); }; enableSongIcons.SetValue += delegate(bool value) { PluginConfig.enableSongIcons = value; PluginConfig.SaveConfig(); }; var maxSimultaneousDownloads = downloaderSubMenu.AddInt("Max simultaneous downloads", 1, 10, 1); maxSimultaneousDownloads.GetValue += delegate { return(PluginConfig.maxSimultaneousDownloads); }; maxSimultaneousDownloads.SetValue += delegate(int value) { PluginConfig.maxSimultaneousDownloads = value; PluginConfig.SaveConfig(); }; var fastScrollSpeed = downloaderSubMenu.AddInt("Fast scroll speed", 2, 20, 1); fastScrollSpeed.GetValue += delegate { return(PluginConfig.fastScrollSpeed); }; fastScrollSpeed.SetValue += delegate(int value) { PluginConfig.fastScrollSpeed = value; PluginConfig.SaveConfig(); }; _moreSongsButton = MenuButtonUI.AddButton("More songs", "Download more songs from BeatSaver.com!", BeatSaverButtonPressed); _moreSongsButton.interactable = SongLoader.AreSongsLoaded; MenuButtonUI.AddButton("More playlists", PlaylistsButtonPressed); if (moreSongsFlowCoordinator == null) { moreSongsFlowCoordinator = new GameObject("MoreSongsFlowCoordinator").AddComponent <MoreSongsFlowCoordinator>(); } yield return(null); initialized = true; }
private void SetupTweaks() { _mainFlowCoordinator = FindObjectOfType <MainFlowCoordinator>(); _mainFlowCoordinator.GetPrivateField <MainMenuViewController>("_mainMenuViewController").didFinishEvent += SongListTweaks_didFinishEvent; RectTransform viewControllersContainer = FindObjectsOfType <RectTransform>().First(x => x.name == "ViewControllers"); if (initialized || PluginConfig.disableSongListTweaks) { return; } Logger.Log("Setting up song list tweaks..."); try { var harmony = HarmonyInstance.Create("BeatSaverDownloaderHarmonyInstance"); harmony.PatchAll(Assembly.GetExecutingAssembly()); } catch (Exception e) { Logger.Log("Unable to patch level list! Exception: " + e); } _playlistsFlowCoordinator = new GameObject("PlaylistsFlowCoordinator").AddComponent <PlaylistsFlowCoordinator>(); _playlistsFlowCoordinator.didFinishEvent += _playlistsFlowCoordinator_didFinishEvent; if (SongLoader.AreSongsLoaded) { _levelCollection = SongLoader.CustomLevelCollectionSO; } else { SongLoader.SongsLoadedEvent += (SongLoader sender, List <CustomLevel> levels) => { _levelCollection = SongLoader.CustomLevelCollectionSO; }; } _simpleDialog = ReflectionUtil.GetPrivateField <SimpleDialogPromptViewController>(_mainFlowCoordinator, "_simpleDialogPromptViewController"); _simpleDialog = Instantiate(_simpleDialog.gameObject, _simpleDialog.transform.parent).GetComponent <SimpleDialogPromptViewController>(); _levelListViewController = viewControllersContainer.GetComponentInChildren <LevelPackLevelsViewController>(true); _levelListViewController.didSelectLevelEvent += _levelListViewController_didSelectLevelEvent; _levelPacksViewController = viewControllersContainer.GetComponentInChildren <LevelPacksViewController>(true); _levelPacksViewController.didSelectPackEvent += _levelPacksViewController_didSelectPackEvent; TableView _songSelectionTableView = _levelListViewController.GetComponentsInChildren <TableView>(true).First(); RectTransform _tableViewRectTransform = _levelListViewController.GetComponentsInChildren <RectTransform>(true).First(x => x.name == "LevelsTableView"); _tableViewRectTransform.sizeDelta = new Vector2(0f, -20.5f); _tableViewRectTransform.anchoredPosition = new Vector2(0f, -2.5f); Button _pageUp = _tableViewRectTransform.GetComponentsInChildren <Button>(true).First(x => x.name == "PageUpButton"); (_pageUp.transform as RectTransform).anchoredPosition = new Vector2(0f, -1f); Button _pageDown = _tableViewRectTransform.GetComponentsInChildren <Button>(true).First(x => x.name == "PageDownButton"); (_pageDown.transform as RectTransform).anchoredPosition = new Vector2(0f, 1f); _fastPageUpButton = Instantiate(_pageUp, _tableViewRectTransform, false); (_fastPageUpButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 1f); (_fastPageUpButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 1f); (_fastPageUpButton.transform as RectTransform).anchoredPosition = new Vector2(-26f, 1f); (_fastPageUpButton.transform as RectTransform).sizeDelta = new Vector2(8f, 6f); _fastPageUpButton.GetComponentsInChildren <RectTransform>().First(x => x.name == "BG").sizeDelta = new Vector2(8f, 6f); _fastPageUpButton.GetComponentsInChildren <UnityEngine.UI.Image>().First(x => x.name == "Arrow").sprite = Sprites.DoubleArrow; _fastPageUpButton.onClick.AddListener(delegate() { FastScrollUp(_songSelectionTableView, PluginConfig.fastScrollSpeed); }); _fastPageDownButton = Instantiate(_pageDown, _tableViewRectTransform, false); (_fastPageDownButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0f); (_fastPageDownButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0f); (_fastPageDownButton.transform as RectTransform).anchoredPosition = new Vector2(-26f, -1f); (_fastPageDownButton.transform as RectTransform).sizeDelta = new Vector2(8f, 6f); _fastPageDownButton.GetComponentsInChildren <RectTransform>().First(x => x.name == "BG").sizeDelta = new Vector2(8f, 6f); _fastPageDownButton.GetComponentsInChildren <UnityEngine.UI.Image>().First(x => x.name == "Arrow").sprite = Sprites.DoubleArrow; _fastPageDownButton.onClick.AddListener(delegate() { FastScrollDown(_songSelectionTableView, PluginConfig.fastScrollSpeed); }); _randomButton = Instantiate(viewControllersContainer.GetComponentsInChildren <Button>(true).First(x => x.name == "PracticeButton"), _levelListViewController.rectTransform, false); _randomButton.onClick = new Button.ButtonClickedEvent(); _randomButton.onClick.AddListener(() => { int randomRow = UnityEngine.Random.Range(0, _songSelectionTableView.dataSource.NumberOfCells()); _songSelectionTableView.ScrollToCellWithIdx(randomRow, TableView.ScrollPositionType.Beginning, false); _songSelectionTableView.SelectCellWithIdx(randomRow, true); }); _randomButton.name = "CustomUIButton"; (_randomButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f); (_randomButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f); (_randomButton.transform as RectTransform).anchoredPosition = new Vector2(35f, 36.25f); (_randomButton.transform as RectTransform).sizeDelta = new Vector2(8.8f, 6f); _randomButton.SetButtonText(""); _randomButton.SetButtonIcon(Sprites.RandomIcon); _randomButton.GetComponentsInChildren <UnityEngine.UI.Image>().First(x => x.name == "Stroke").sprite = Resources.FindObjectsOfTypeAll <Sprite>().First(x => x.name == "RoundRectSmallStroke"); var _randomIconLayout = _randomButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); _randomIconLayout.padding = new RectOffset(0, 0, 0, 0); _searchButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(-20f, 36.25f), new Vector2(20f, 6f), SearchPressed, "Search"); _searchButton.SetButtonTextSize(3f); _searchButton.ToggleWordWrapping(false); _sortByButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(0f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.SortBy); }, "Sort By"); _sortByButton.SetButtonTextSize(3f); _sortByButton.ToggleWordWrapping(false); _playlistsButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(20f, 36.25f), new Vector2(20f, 6f), PlaylistsButtonPressed, "Playlists"); _playlistsButton.SetButtonTextSize(3f); _playlistsButton.ToggleWordWrapping(false); _defButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(-20f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.Select); SetLevels(SortMode.Default, ""); }, "Default"); _defButton.SetButtonTextSize(3f); _defButton.ToggleWordWrapping(false); _defButton.gameObject.SetActive(false); _newButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(0f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.Select); SetLevels(SortMode.Newest, ""); }, "Newest"); _newButton.SetButtonTextSize(3f); _newButton.ToggleWordWrapping(false); _newButton.gameObject.SetActive(false); _difficultyButton = _levelListViewController.CreateUIButton("CreditsButton", new Vector2(20f, 36.25f), new Vector2(20f, 6f), () => { SelectTopButtons(TopButtonsState.Select); SetLevels(SortMode.Difficulty, ""); }, "Difficulty"); _difficultyButton.SetButtonTextSize(3f); _difficultyButton.ToggleWordWrapping(false); _difficultyButton.gameObject.SetActive(false); _detailViewController = viewControllersContainer.GetComponentsInChildren <StandardLevelDetailViewController>(true).First(x => x.name == "LevelDetailViewController"); _detailViewController.didChangeDifficultyBeatmapEvent += _difficultyViewController_didSelectDifficultyEvent; RectTransform buttonsRect = _detailViewController.GetComponentsInChildren <RectTransform>(true).First(x => x.name == "PlayButtons"); _favoriteButton = Instantiate(viewControllersContainer.GetComponentsInChildren <Button>(true).First(x => x.name == "PracticeButton"), buttonsRect, false); _favoriteButton.onClick = new Button.ButtonClickedEvent(); _favoriteButton.onClick.AddListener(() => { if (PluginConfig.favoriteSongs.Any(x => x.Contains(_detailViewController.selectedDifficultyBeatmap.level.levelID))) { PluginConfig.favoriteSongs.Remove(_detailViewController.selectedDifficultyBeatmap.level.levelID); PluginConfig.SaveConfig(); _favoriteButton.SetButtonIcon(Sprites.AddToFavorites); PlaylistsCollection.RemoveLevelFromPlaylist(PlaylistsCollection.loadedPlaylists.First(x => x.playlistTitle == "Your favorite songs"), _detailViewController.selectedDifficultyBeatmap.level.levelID); } else { PluginConfig.favoriteSongs.Add(_detailViewController.selectedDifficultyBeatmap.level.levelID); PluginConfig.SaveConfig(); _favoriteButton.SetButtonIcon(Sprites.RemoveFromFavorites); PlaylistsCollection.AddSongToPlaylist(PlaylistsCollection.loadedPlaylists.First(x => x.playlistTitle == "Your favorite songs"), new PlaylistSong() { levelId = _detailViewController.selectedDifficultyBeatmap.level.levelID, songName = _detailViewController.selectedDifficultyBeatmap.level.songName, level = SongDownloader.GetLevel(_detailViewController.selectedDifficultyBeatmap.level.levelID) }); } }); _favoriteButton.name = "CustomUIButton"; _favoriteButton.SetButtonIcon(Sprites.AddToFavorites); (_favoriteButton.transform as RectTransform).sizeDelta = new Vector2(12f, 8.8f); var _favoriteIconLayout = _favoriteButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); _favoriteIconLayout.padding = new RectOffset(3, 3, 0, 0); _favoriteButton.transform.SetAsFirstSibling(); Button practiceButton = buttonsRect.GetComponentsInChildren <Button>().First(x => x.name == "PracticeButton"); (practiceButton.transform as RectTransform).sizeDelta = new Vector2(12f, 8.8f); var _practiceIconLayout = practiceButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); _practiceIconLayout.padding = new RectOffset(3, 3, 0, 0); _deleteButton = Instantiate(viewControllersContainer.GetComponentsInChildren <Button>(true).First(x => x.name == "PracticeButton"), buttonsRect, false); _deleteButton.onClick = new Button.ButtonClickedEvent(); _deleteButton.onClick.AddListener(DeletePressed); _deleteButton.name = "CustomUIButton"; _deleteButton.SetButtonIcon(Sprites.DeleteIcon); _deleteButton.interactable = !PluginConfig.disableDeleteButton; (_deleteButton.transform as RectTransform).sizeDelta = new Vector2(8.8f, 8.8f); _deleteButton.GetComponentsInChildren <UnityEngine.UI.Image>().First(x => x.name == "Stroke").sprite = Resources.FindObjectsOfTypeAll <Sprite>().First(x => x.name == "RoundRectSmallStroke"); var _deleteIconLayout = _deleteButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); _deleteIconLayout.padding = new RectOffset(0, 0, 1, 1); _deleteButton.transform.SetAsLastSibling(); //based on https://github.com/halsafar/BeatSaberSongBrowser/blob/master/SongBrowserPlugin/UI/Browser/SongBrowserUI.cs#L192 var statsPanel = _detailViewController.GetComponentsInChildren <LevelParamsPanel>(true).First(x => x.name == "LevelParamsPanel"); var statTransforms = statsPanel.GetComponentsInChildren <RectTransform>(true); var valueTexts = statsPanel.GetComponentsInChildren <TextMeshProUGUI>(true).Where(x => x.name == "ValueText").ToList(); foreach (RectTransform r in statTransforms) { if (r.name == "Separator") { continue; } r.sizeDelta = new Vector2(r.sizeDelta.x * 0.85f, r.sizeDelta.y * 0.85f); } var _starStatTransform = Instantiate(statTransforms[1], statsPanel.transform, false); _starStatText = _starStatTransform.GetComponentInChildren <TextMeshProUGUI>(true); _starStatTransform.GetComponentInChildren <UnityEngine.UI.Image>(true).sprite = Sprites.StarFull; _starStatText.text = "--"; ResultsViewController _standardLevelResultsViewController = viewControllersContainer.GetComponentsInChildren <ResultsViewController>(true).First(x => x.name == "StandardLevelResultsViewController"); _standardLevelResultsViewController.continueButtonPressedEvent += _standardLevelResultsViewController_continueButtonPressedEvent; initialized = true; }
private void SetupUI() { if (initialized) { return; } RectTransform mainMenu = (Resources.FindObjectsOfTypeAll <MainMenuViewController>().First().rectTransform); MenuButtonUI.AddButton("More songs...", BeatSaverButtonPressed); //_moreSongsButton.interactable = false; var downloaderSubMenu = SettingsUI.CreateSubMenu("Downloader"); var disableDeleteButton = downloaderSubMenu.AddBool("Disable delete button"); disableDeleteButton.GetValue += delegate { return(PluginConfig.disableDeleteButton); }; disableDeleteButton.SetValue += delegate(bool value) { PluginConfig.disableDeleteButton = value; PluginConfig.SaveConfig(); }; var deleteToRecycleBin = downloaderSubMenu.AddBool("Delete to Recycle Bin"); deleteToRecycleBin.GetValue += delegate { return(PluginConfig.deleteToRecycleBin); }; deleteToRecycleBin.SetValue += delegate(bool value) { PluginConfig.deleteToRecycleBin = value; PluginConfig.SaveConfig(); }; var maxSimultaneousDownloads = downloaderSubMenu.AddInt("Max simultaneous downloads", 1, 10, 1); maxSimultaneousDownloads.GetValue += delegate { return(PluginConfig.maxSimultaneousDownloads); }; maxSimultaneousDownloads.SetValue += delegate(int value) { PluginConfig.maxSimultaneousDownloads = value; PluginConfig.SaveConfig(); }; initialized = true; }