Files
source/Assets/Scripts/LeaderboardsMenu.cs

196 lines
8.5 KiB
C#

using System;
using Newtonsoft.Json.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class LeaderboardsMenu : MonoBehaviour
{
[SerializeField] private TMP_Text statusText;
[SerializeField] private Button backButton;
[SerializeField] private Button refreshButton;
[SerializeField] private ProfileMenu profilePrefab;
[SerializeField] private GameObject selectionPanel;
[SerializeField] private Button selectionScoreButton;
[SerializeField] private Button selectionBerryButton;
[SerializeField] private Button selectionCoinButton;
[SerializeField] private Button selectionLegacyButton;
[SerializeField] private Button selectionTotalBerriesButton;
[SerializeField] private GameObject scoresPanel;
[SerializeField] private GameObject content;
[SerializeField] private GameObject sampleObject;
[SerializeField] private TMP_Dropdown berryShowTypeDropdown;
private int mode = -1;
void Awake()
{
selectionScoreButton.onClick.AddListener(() => { mode = 0; SwitchMenu(1); });
selectionBerryButton.onClick.AddListener(() => { mode = 1; SwitchMenu(1); });
selectionCoinButton.onClick.AddListener(() => { mode = 2; SwitchMenu(1); });
selectionLegacyButton.onClick.AddListener(() => { mode = 3; SwitchMenu(1); });
selectionTotalBerriesButton.onClick.AddListener(() => { mode = 4; SwitchMenu(1); });
berryShowTypeDropdown.onValueChanged.AddListener(_ => GetTopPlayers());
backButton.onClick.AddListener(async () =>
{
if (selectionPanel.activeSelf) await SceneManager.LoadSceneAsync("MainMenu");
else if (scoresPanel.activeSelf) SwitchMenu(0);
});
refreshButton.onClick.AddListener(GetTopPlayers);
}
void SwitchMenu(int menu)
{
UpdateStatus(false, "");
if (!selectionPanel.activeSelf)
{
foreach (Transform item in content.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
}
if (menu == 0)
{
mode = -1;
refreshButton.gameObject.SetActive(false);
selectionPanel.SetActive(true);
scoresPanel.SetActive(false);
}
else if (menu == 1)
{
refreshButton.transform.localPosition = mode == 1 ? new Vector2(402.5f, 282.33f) : new Vector2(-402.5f, -282.33f);
refreshButton.gameObject.SetActive(true);
berryShowTypeDropdown.gameObject.SetActive(mode == 1);
berryShowTypeDropdown.value = 0;
selectionPanel.SetActive(false);
scoresPanel.SetActive(true);
GetTopPlayers();
}
}
async void GetTopPlayers()
{
backButton.interactable = false;
refreshButton.interactable = false;
foreach (Transform item in content.transform)
{
if (item.gameObject.activeSelf)
{
Destroy(item.gameObject);
}
}
UpdateStatus(true, "Loading...");
using UnityWebRequest request = UnityWebRequest.Get(mode == 0
? Endpoints.LEADERBOARDS_SCORE_ENDPOINT
: mode == 1
? Endpoints.LEADERBOARDS_BERRY_ENDPOINT + "?berry=" + berryShowTypeDropdown.value
: mode == 2
? Endpoints.LEADERBOARDS_COIN_ENDPOINT
: mode == 3
? Endpoints.LEADERBOARDS_LEGACY_ENDPOINT
: Endpoints.LEADERBOARDS_TOTAL_ENDPOINT);
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
UpdateStatus(false);
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
foreach (var entry in jsonResponse["data"].ToObject<LeaderboardEntry[]>())
{
var entryInfo = Instantiate(sampleObject, content.transform);
var usernameText = entryInfo.transform.GetChild(0).GetComponent<TMP_Text>();
var playerIcon = usernameText.transform.GetChild(0).GetComponent<Image>();
var playerIconButton = usernameText.transform.GetChild(0).GetComponent<Button>();
var playerOverlay = playerIcon.transform.GetChild(0).GetComponent<Image>();
var scoreText = entryInfo.transform.GetChild(1).GetComponent<TMP_Text>();
usernameText.text = $"{entry.Username} (#{entry.UserID + 1})";
scoreText.text = (mode == 2 ? "Coins: " : "Berries: ") + Tools.FormatWithCommas(entry.Value);
if (BazookaManager.Instance.GetAccountID() == entry.UserID)
{
usernameText.text = $"<color=#7FFFD4>{usernameText.text}</color>";
scoreText.text = $"<color=#7FFFD4>{scoreText.text}</color>";
}
if (entry.CustomIcon == null)
{
playerIcon.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + entry.Icon);
if (entry.Icon == 1) playerIcon.sprite = Tools.GetIconForUser(entry.UserID);
playerOverlay.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + entry.Overlay);
if (entry.Overlay != 0) playerOverlay.gameObject.SetActive(true);
if (entry.Overlay == 8) playerOverlay.transform.localPosition = new Vector2(-16.56f, 14.81f);
else if (entry.Overlay == 11) playerOverlay.transform.localPosition = new Vector2(-14.74451f, 20.39122f);
else if (entry.Overlay == 13) playerOverlay.transform.localPosition = new Vector2(-16.54019f, 14.70365f);
try
{
playerIcon.color = new Color(entry.BirdColor[0] / 255f, entry.BirdColor[1] / 255f, entry.BirdColor[2] / 255f);
playerOverlay.color = new Color(entry.BirdColor[0] / 255f, entry.BirdColor[1] / 255f, entry.BirdColor[2] / 255f);
}
catch
{
playerIcon.color = Color.white;
playerOverlay.color = Color.white;
}
}
else playerIcon.gameObject.AddComponent<WaitingForCustomIcon>().ID = entry.CustomIcon;
playerIconButton.onClick.AddListener(async () =>
{
var clone = Instantiate(profilePrefab.gameObject, profilePrefab.gameObject.transform.parent);
clone.SetActive(true);
await clone.GetComponent<ProfileMenu>().Init(entry.UserID);
});
entryInfo.SetActive(true);
}
CustomIconLoader.Init(FindObjectsByType<WaitingForCustomIcon>(FindObjectsSortMode.None));
}
else
{
UpdateStatus(true, (string)jsonResponse["message"]);
}
}
catch (Exception e)
{
UpdateStatus(true, "Failed to fetch leaderboard stats: " + e);
}
}
else
{
UpdateStatus(true, "Failed to fetch leaderboard stats");
}
backButton.interactable = true;
refreshButton.interactable = true;
}
private void UpdateStatus(bool enabled, string message = "")
{
statusText.gameObject.SetActive(enabled);
statusText.text = message;
}
async void Update()
{
if (Keyboard.current.escapeKey.wasPressedThisFrame && FindFirstObjectByType<ProfileMenu>() == null)
{
if (!selectionPanel.activeSelf) SwitchMenu(0);
else await SceneManager.LoadSceneAsync("MainMenu");
}
}
}