Files
source/Assets/Scripts/ProfileMenu.cs

406 lines
17 KiB
C#

using System.Linq;
using System.Numerics;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Networking;
using UnityEngine.UI;
public class ProfileMenu : MonoBehaviour
{
[SerializeField] private Button exitButton;
[SerializeField] private Button refreshButton;
[SerializeField] private Button postButton;
[SerializeField] private GameObject contentPanel;
[SerializeField] private TMP_Text loadingText;
[SerializeField] private GameObject voteOverlay;
[SerializeField] private GameObject postOverlay;
[SerializeField] private TMP_Text normalBerryStat;
[SerializeField] private TMP_Text poisonBerryStat;
[SerializeField] private TMP_Text slowBerryStat;
[SerializeField] private TMP_Text ultraBerryStat;
[SerializeField] private TMP_Text speedyBerryStat;
[SerializeField] private TMP_Text coinBerryStat;
[SerializeField] private TMP_Text randomBerryStat;
[SerializeField] private TMP_Text antiBerryStat;
[SerializeField] private TMP_Text coinStat;
[SerializeField] private TMP_Text playerNameText;
[SerializeField] private Image playerIconImage;
[SerializeField] private Image playerOverlayImage;
[SerializeField] private GameObject postSample;
[SerializeField] private bool canVote = true;
private GameObject popupObject;
void Awake()
{
exitButton.onClick.AddListener(() => Destroy(gameObject));
}
public async Task Init(
string normalBerries,
string poisonBerries,
string slowBerries,
string ultraBerries,
string speedyBerries,
string coinBerries,
string randomBerries,
string antiBerries,
string coins,
string playerName,
BigInteger playerID,
int playerIcon,
int playerOverlay,
string customIcon,
Color playerIconColor,
Color playerOverlayColor
)
{
normalBerryStat.text = normalBerries;
poisonBerryStat.text = poisonBerries;
slowBerryStat.text = slowBerries;
ultraBerryStat.text = ultraBerries;
speedyBerryStat.text = speedyBerries;
coinBerryStat.text = coinBerries;
randomBerryStat.text = randomBerries;
antiBerryStat.text = antiBerries;
coinStat.text = coins;
playerNameText.text = playerName;
if (customIcon == null)
{
playerIconImage.sprite = Resources.Load<Sprite>("Icons/Icons/bird_" + playerIcon);
if (playerIcon == 1)
{
playerIconImage.sprite = Tools.GetIconForUser(playerID);
}
playerOverlayImage.sprite = Resources.Load<Sprite>("Icons/Overlays/overlay_" + playerOverlay);
if (playerOverlay == 0)
{
playerOverlayImage.gameObject.SetActive(false);
}
else if (playerOverlay == 8)
{
playerOverlayImage.transform.localPosition = new UnityEngine.Vector2(-16.56f, 14.81f);
}
else if (playerOverlay == 11)
{
playerOverlayImage.transform.localPosition = new UnityEngine.Vector2(-14.74451f, 20.39122f);
}
else if (playerOverlay == 13)
{
playerOverlayImage.transform.localPosition = new UnityEngine.Vector2(-16.54019f, 14.70365f);
}
playerIconImage.color = playerIconColor;
playerOverlayImage.color = playerOverlayColor;
}
else
{
Tools.RenderFromBase64(customIcon, playerIconImage);
playerOverlayImage.gameObject.SetActive(false);
}
if (BazookaManager.Instance.GetAccountID() == playerID)
{
postButton.gameObject.SetActive(true);
postButton.onClick.AddListener(UploadPostPopup);
}
contentPanel.SetActive(true);
loadingText.gameObject.SetActive(false);
Tools.RefreshHierarchy(gameObject);
refreshButton.onClick.AddListener(async () => await RefreshPosts(playerID, playerName));
await RefreshPosts(playerID, playerName);
}
public async Task Init(BigInteger playerID)
{
if (BazookaManager.Instance.GetAccountID() == playerID) { await Init(); return; }
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.PROFILE_ENDPOINT + "?userId=" + playerID.ToString());
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.downloadHandler.text == null)
{
Destroy(gameObject);
return;
}
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
var iconColorArray = JArray.Parse(jsonResponse["data"]["iconColor"].Type == JTokenType.Null ? "[255,255,255]" : jsonResponse["data"]["iconColor"].ToString());
var overlayColorArray = JArray.Parse(jsonResponse["data"]["overlayColor"].Type == JTokenType.Null ? "[255,255,255]" : jsonResponse["data"]["overlayColor"].ToString());
var iconColor = new Color((int)iconColorArray[0] / 255f, (int)iconColorArray[1] / 255f, (int)iconColorArray[2] / 255f);
var overlayColor = new Color((int)overlayColorArray[0] / 255f, (int)overlayColorArray[1] / 255f, (int)overlayColorArray[2] / 255f);
await Init(
(string)jsonResponse["data"]["stats"]["totalNormalBerries"],
(string)jsonResponse["data"]["stats"]["totalPoisonBerries"],
(string)jsonResponse["data"]["stats"]["totalSlowBerries"],
(string)jsonResponse["data"]["stats"]["totalUltraBerries"],
(string)jsonResponse["data"]["stats"]["totalSpeedyBerries"],
(string)jsonResponse["data"]["stats"]["totalCoinBerries"],
(string)jsonResponse["data"]["stats"]["totalRandomBerries"],
(string)jsonResponse["data"]["stats"]["totalAntiBerries"],
(string)jsonResponse["data"]["stats"]["coins"],
(string)jsonResponse["data"]["username"],
playerID,
int.Parse(jsonResponse["data"]["icon"].Type == JTokenType.Null ? "1" : jsonResponse["data"]["icon"].ToString()),
int.Parse(jsonResponse["data"]["overlay"].Type == JTokenType.Null ? "0" : jsonResponse["data"]["overlay"].ToString()),
(string)jsonResponse["data"]["customIcon"],
iconColor,
overlayColor
);
}
else
{
Destroy(gameObject);
}
}
catch
{
Destroy(gameObject);
}
}
public async Task Init()
{
var customIconData = BazookaManager.Instance.GetCustomBirdIconData();
string customIcon = null;
if (customIconData.Selected != null)
{
foreach (var icon in customIconData.Data)
{
if (icon.UUID == customIconData.Selected)
{
customIcon = icon.Data;
}
}
}
var iconColor = BazookaManager.Instance.GetColorSettingIcon();
var overlayColor = BazookaManager.Instance.GetColorSettingOverlay();
await Init(
BazookaManager.Instance.GetGameStoreTotalNormalBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalPoisonBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalSlowBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalUltraBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalSpeedyBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalCoinBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalRandomBerries().ToString(),
BazookaManager.Instance.GetGameStoreTotalAntiBerries().ToString(),
customIconData.Balance.ToString(),
BazookaManager.Instance.GetAccountName().ToString(),
BazookaManager.Instance.GetAccountID() ?? 0,
BazookaManager.Instance.GetBirdIcon(),
BazookaManager.Instance.GetBirdOverlay(),
customIcon,
new Color((int)iconColor[0] / 255f, (int)iconColor[1] / 255f, (int)iconColor[2] / 255f),
new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f)
);
}
async Task RefreshPosts(BigInteger playerID, string playerName)
{
exitButton.interactable = false;
refreshButton.interactable = false;
postButton.interactable = false;
foreach (Transform post in postSample.transform.parent)
{
if (post.gameObject.activeSelf)
{
Destroy(post.gameObject);
}
}
using UnityWebRequest request = UnityWebRequest.Get(Endpoints.PROFILE_POSTS_ENDPOINT + "?userId=" + playerID.ToString());
request.SetRequestHeader("Requester", "BerryDashClient");
request.SetRequestHeader("ClientVersion", Application.version);
request.SetRequestHeader("ClientPlatform", Application.platform.ToString());
await request.SendWebRequest();
if (request.downloadHandler.text == null)
{
exitButton.interactable = true;
refreshButton.interactable = true;
return;
}
string response = request.downloadHandler.text;
var posts = JArray.Parse(response).ToObject<ProfileMessageResponse[]>();
foreach (var post in posts)
{
var entry = Instantiate(postSample, postSample.transform.parent);
var entryUsername = entry.transform.GetChild(0).GetComponent<TMP_Text>();
var entryLikesParent = entry.transform.GetChild(1);
var entryLikesTexture = entryLikesParent.GetChild(1).GetComponent<TMP_Text>();
var entryLikesButton = entryLikesParent.GetChild(1).GetComponent<Button>();
var entryLikesCount = entryLikesParent.GetChild(2).GetComponent<TMP_Text>();
var entryMessage = entry.transform.GetChild(2).GetComponent<TMP_Text>();
var entryTimestamp = entry.transform.GetChild(3).GetComponent<TMP_Text>();
var entryDeleteButton = entryLikesParent.GetChild(0).GetComponent<Button>();
entryUsername.text = playerName;
entryLikesTexture.text = post.Likes < 0 ? "\\uf165" : "\\uf164";
entryLikesTexture.color = post.Likes < 0 ? new Color(1f, 0f, 0.5f) : new Color(1f, 1f, 0f);
entryLikesCount.text = Tools.FormatWithCommas(post.Likes);
entryLikesButton.onClick.AddListener(() =>
{
if (canVote && BazookaManager.Instance.GetAccountID() != null && BazookaManager.Instance.GetAccountID() != playerID)
{
var likedPosts = BazookaManager.Instance
.GetLikedPosts()
.Select(x => x.ToString())
.ToList();
if (!likedPosts.Any(x => x.ToString() == post.ID.ToString())) VotePost(post.ID, entryLikesCount, entryLikesTexture);
}
});
entryMessage.text = post.Content;
entryTimestamp.text = post.Timestamp.ToString();
if (BazookaManager.Instance.GetAccountID() == playerID)
{
entryDeleteButton.gameObject.SetActive(true);
entryDeleteButton.onClick.AddListener(async () => await DeletePost(entry, post.ID));
}
entry.name = "PostEntry_" + post.ID;
entry.SetActive(true);
Tools.RefreshHierarchy(entry);
}
exitButton.interactable = true;
refreshButton.interactable = true;
postButton.interactable = true;
}
void VotePost(BigInteger postId, TMP_Text entryLikesCount, TMP_Text entryLikesTexture)
{
var popup = Instantiate(voteOverlay, voteOverlay.transform.parent);
popupObject = popup;
popup.SetActive(true);
var exitButton = popup.transform.GetChild(0).GetChild(0).GetComponent<Button>();
var likeButton = popup.transform.GetChild(0).GetChild(2).GetComponent<Button>();
var dislikeButton = popup.transform.GetChild(0).GetChild(3).GetComponent<Button>();
exitButton.onClick.AddListener(() => Destroy(popup));
likeButton.onClick.AddListener(async () =>
{
canVote = false;
popupObject = null;
Destroy(popup);
await SendPostVote(postId, true, entryLikesCount, entryLikesTexture);
canVote = true;
});
dislikeButton.onClick.AddListener(async () =>
{
canVote = false;
popupObject = null;
Destroy(popup);
await SendPostVote(postId, false, entryLikesCount, entryLikesTexture);
canVote = true;
});
}
async Task SendPostVote(BigInteger postId, bool liked, TMP_Text entryLikesCount, TMP_Text entryLikesTexture)
{
using UnityWebRequest request = UnityWebRequest.Put(Endpoints.PROFILE_POSTS_ENDPOINT + $"?id={postId}&liked={liked}", new WWWForm().data);
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)
{
return;
}
string response = request.downloadHandler.text;
try
{
var jsonResponse = JObject.Parse(response);
if ((bool)jsonResponse["success"])
{
BigInteger likes = BigInteger.Parse((string)jsonResponse["data"]["likes"]);
entryLikesCount.text = Tools.FormatWithCommas(likes);
entryLikesTexture.text = likes < 0 ? "\\uf165" : "\\uf164";
entryLikesTexture.color = likes < 0 ? new Color(1f, 0f, 0.5f) : new Color(1f, 1f, 0f);
var likedPosts = BazookaManager.Instance.GetLikedPosts();
likedPosts.Add(postId.ToString());
BazookaManager.Instance.SetLikedPosts(likedPosts);
}
}
catch
{
Debug.LogError("Failed to proccess vote");
}
}
void UploadPostPopup()
{
var popup = Instantiate(postOverlay, postOverlay.transform.parent);
popupObject = popup;
popup.SetActive(true);
var inputBox = popup.transform.GetChild(0).GetChild(1).GetComponent<TMP_InputField>();
var cancelButton = popup.transform.GetChild(0).GetChild(2).GetComponent<Button>();
var submitButton = popup.transform.GetChild(0).GetChild(3).GetComponent<Button>();
cancelButton.onClick.AddListener(() =>
{
Destroy(popup);
popupObject = null;
});
submitButton.onClick.AddListener(async () =>
{
if (inputBox.text.Trim().Length == 0) return;
popupObject = null;
Destroy(popup);
await UploadPost(inputBox.text);
});
}
async Task UploadPost(string message)
{
WWWForm dataForm = new();
dataForm.AddField("content", message);
using UnityWebRequest request = UnityWebRequest.Post(Endpoints.PROFILE_POSTS_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.result == UnityWebRequest.Result.Success && request.responseCode == 200)
{
await RefreshPosts(BazookaManager.Instance.GetAccountID() ?? 0, BazookaManager.Instance.GetAccountName());
}
}
async Task DeletePost(GameObject entryObject, BigInteger targetId)
{
using UnityWebRequest request = UnityWebRequest.Delete(Endpoints.PROFILE_POSTS_ENDPOINT + "?id=" + targetId.ToString());
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.result == UnityWebRequest.Result.Success && request.responseCode == 200)
{
Destroy(entryObject);
}
}
void Update()
{
if (Keyboard.current.escapeKey.wasPressedThisFrame)
{
if (popupObject != null)
{
if (!canVote) canVote = true;
Destroy(popupObject);
}
else Destroy(gameObject);
}
}
}