using System; using System.Collections; using System.Linq; using System.Numerics; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TMPro; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; public class IconMarketplaceDownloadIcon : MonoBehaviour { private readonly static WaitForSeconds _waitForSeconds2 = new(2f); [SerializeField] private IconMarketplaceManager marketplaceManager; [SerializeField] private TMP_Text statusText; [SerializeField] private TMP_Text balanceText; [SerializeField] private Button backButton; public GameObject content; [SerializeField] private GameObject sample; private string statusMessage; private Coroutine statusRoutine; public AudioSource iconPurchaseSound; [SerializeField] private Button refreshButton; [SerializeField] private Button optionsButton; [SerializeField] private GameObject optionsPanel; [SerializeField] private Button optionsPanelSubmitButton; [SerializeField] private Button optionsPanelResetButton; public TMP_Dropdown optionsPanelSortByDropdown; public Toggle optionsPanelPriceRangeToggle; [SerializeField] private TMP_InputField optionsPanelPriceRangeMinInput; [SerializeField] private TMP_InputField optionsPanelPriceRangeMaxInput; internal string priceRangeMin = "10"; internal string priceRangeMax = "250"; public Toggle optionsPanelSearchForToggle; [SerializeField] private TMP_InputField optionsPanelSearchForInputField; internal string searchForValue = ""; [SerializeField] private Toggle optionsPanelOnlyShowToggle; [SerializeField] private TMP_Dropdown optionsPanelOnlyShowDropdown; internal bool anyChanges = false; void Awake() { backButton.onClick.AddListener(() => marketplaceManager.SwitchPanel(0)); refreshButton.onClick.AddListener(GetIcons); optionsButton.onClick.AddListener(() => optionsPanel.SetActive(true)); optionsPanelSubmitButton.onClick.AddListener(() => { optionsPanel.SetActive(false); if (anyChanges) { anyChanges = false; GetIcons(); } }); optionsPanelResetButton.onClick.AddListener(() => { optionsPanelSortByDropdown.value = 3; optionsPanelPriceRangeToggle.isOn = false; optionsPanelSearchForToggle.isOn = false; optionsPanelOnlyShowToggle.isOn = false; }); optionsPanelPriceRangeToggle.onValueChanged.AddListener((on) => { anyChanges = true; if (!on) { optionsPanelPriceRangeMinInput.text = "10"; optionsPanelPriceRangeMaxInput.text = "250"; } optionsPanelPriceRangeMinInput.interactable = on; optionsPanelPriceRangeMaxInput.interactable = on; }); optionsPanelSearchForToggle.onValueChanged.AddListener((on) => { anyChanges = true; if (!on) optionsPanelSearchForInputField.text = ""; optionsPanelSearchForInputField.interactable = on; }); optionsPanelOnlyShowToggle.onValueChanged.AddListener((on) => { anyChanges = true; if (!on) optionsPanelOnlyShowDropdown.value = 0; optionsPanelOnlyShowDropdown.interactable = on; }); optionsPanelSortByDropdown.onValueChanged.AddListener((_) => anyChanges = true); optionsPanelPriceRangeMinInput.onValueChanged.AddListener((value) => { anyChanges = true; priceRangeMin = value; }); optionsPanelPriceRangeMaxInput.onValueChanged.AddListener((value) => { anyChanges = true; priceRangeMax = value; }); optionsPanelSearchForInputField.onValueChanged.AddListener((value) => { anyChanges = true; searchForValue = value; }); optionsPanelOnlyShowDropdown.onValueChanged.AddListener((_) => anyChanges = true); } internal void Load() { GetIcons(); balanceText.text = "You have " + Tools.FormatWithCommas(BazookaManager.Instance.GetCustomBirdIconData().Balance) + " coins to spend"; } async void GetIcons() { refreshButton.interactable = false; optionsButton.interactable = false; backButton.interactable = false; foreach (Transform item in content.transform) { if (item.gameObject.activeSelf) { Destroy(item.gameObject); } } var currentIcons = new JArray(); foreach (var icon in BazookaManager.Instance.GetCustomBirdIconData().Data) { currentIcons.Add(icon.UUID); } ShowStatus("Loading..."); WWWForm dataForm = new(); dataForm.AddField("sortBy", optionsPanelSortByDropdown.value.ToString()); dataForm.AddField("priceRangeEnabled", optionsPanelPriceRangeToggle.isOn.ToString()); dataForm.AddField("priceRangeMin", priceRangeMin); dataForm.AddField("priceRangeMax", priceRangeMax); dataForm.AddField("searchForEnabled", optionsPanelSearchForToggle.isOn.ToString()); dataForm.AddField("searchForValue", searchForValue); dataForm.AddField("onlyShowEnabled", optionsPanelOnlyShowToggle.isOn.ToString()); dataForm.AddField("onlyShowValue", optionsPanelOnlyShowDropdown.value.ToString()); dataForm.AddField("currentIcons", Convert.ToBase64String(Encoding.UTF8.GetBytes(currentIcons.ToString(Formatting.None)))); using UnityWebRequest request = UnityWebRequest.Post(Endpoints.ICON_MARKETPLACE_ENDPOINT, dataForm); request.SetRequestHeader("Authorization", BazookaManager.Instance.GetAccountSession() ?? ""); request.SetRequestHeader("Requester", "BerryDashClient"); request.SetRequestHeader("ClientVersion", Application.version); request.SetRequestHeader("ClientPlatform", Application.platform.ToString()); await request.SendWebRequest(); if (request.downloadHandler.text == null) { refreshButton.interactable = true; optionsButton.interactable = true; backButton.interactable = true; ShowStatus("Failed to make HTTP request"); return; } string response = request.downloadHandler.text; if (response == "-999") { ShowStatus("Server error while fetching data"); } else if (response == "-998") { ShowStatus("Client version too outdated to access servers"); } else if (response == "-997") { ShowStatus("Encryption/decryption issues"); } else if (response == "-996") { ShowStatus("Can't send requests on self-built instance"); } else { ShowStatus(null); var jsonResponse = JObject.Parse(response); var icons = JsonConvert.DeserializeObject(jsonResponse["data"].ToString()); var localUserID = BazookaManager.Instance.GetAccountID(); foreach (var entry in icons) { GameObject newIcon = Instantiate(sample, content.transform); newIcon.name = "IconEntry"; Tools.RenderFromBase64(entry.Data, newIcon.transform.GetChild(0).GetChild(0).GetComponent()); newIcon.transform.GetChild(1).GetComponent().text = "Bird Name: " + entry.Name; newIcon.transform.GetChild(2).GetComponent().text = "Price " + Tools.FormatWithCommas(entry.Price) + " coins"; newIcon.transform.GetChild(3).GetComponent().text = "Designer Name: " + entry.CreatorUsername; var btnGrid = newIcon.transform.GetChild(4); var buybtn = btnGrid.transform.GetChild(0).GetComponent