379 lines
17 KiB
C#
379 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 goldenBerryStat;
|
|
[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 goldenBerries,
|
|
string coins,
|
|
string playerName,
|
|
BigInteger playerID,
|
|
int? playerIcon,
|
|
int? playerOverlay,
|
|
Color playerIconColor,
|
|
Color playerOverlayColor,
|
|
string customIcon
|
|
)
|
|
{
|
|
normalBerryStat.text = Tools.FormatWithCommas(normalBerries);
|
|
poisonBerryStat.text = Tools.FormatWithCommas(poisonBerries);
|
|
slowBerryStat.text = Tools.FormatWithCommas(slowBerries);
|
|
ultraBerryStat.text = Tools.FormatWithCommas(ultraBerries);
|
|
speedyBerryStat.text = Tools.FormatWithCommas(speedyBerries);
|
|
coinBerryStat.text = Tools.FormatWithCommas(coinBerries);
|
|
randomBerryStat.text = Tools.FormatWithCommas(randomBerries);
|
|
antiBerryStat.text = Tools.FormatWithCommas(antiBerries);
|
|
goldenBerryStat.text = Tools.FormatWithCommas(goldenBerries);
|
|
coinStat.text = Tools.FormatWithCommas(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(true);
|
|
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
|
|
{
|
|
var waitingForCustomIcon = playerIconImage.gameObject.AddComponent<WaitingForCustomIcon>();
|
|
waitingForCustomIcon.ID = customIcon;
|
|
CustomIconLoader.Init(new[] { waitingForCustomIcon });
|
|
}
|
|
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.BD_ACCOUNT_ENDPOINT + "?id=" + playerID.ToString() + "&exact=true");
|
|
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 data = jsonResponse["data"].ToObject<Account>();
|
|
|
|
var iconColorArray = data.BirdColor;
|
|
var overlayColorArray = data.OverlayColor;
|
|
var iconColor = new Color(iconColorArray[0] / 255f, iconColorArray[1] / 255f, iconColorArray[2] / 255f);
|
|
var overlayColor = new Color(overlayColorArray[0] / 255f, overlayColorArray[1] / 255f, overlayColorArray[2] / 255f);
|
|
await Init(
|
|
data.Stats.TotalNormalBerries.ToString(),
|
|
data.Stats.TotalPoisonBerries.ToString(),
|
|
data.Stats.TotalSlowBerries.ToString(),
|
|
data.Stats.TotalUltraBerries.ToString(),
|
|
data.Stats.TotalSpeedyBerries.ToString(),
|
|
data.Stats.TotalCoinBerries.ToString(),
|
|
data.Stats.TotalRandomBerries.ToString(),
|
|
data.Stats.TotalAntiBerries.ToString(),
|
|
data.Stats.TotalGoldenBerries.ToString(),
|
|
data.Stats.Coins.ToString(),
|
|
data.Username,
|
|
playerID,
|
|
data.Icon,
|
|
data.Overlay,
|
|
iconColor,
|
|
overlayColor,
|
|
data.CustomIcon
|
|
);
|
|
}
|
|
else
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
}
|
|
|
|
public async Task Init()
|
|
{
|
|
var customIconData = BazookaManager.Instance.GetCustomBirdIconData();
|
|
var iconColor = customIconData.Selected == null ? BazookaManager.Instance.GetColorSettingIcon() : null;
|
|
var overlayColor = customIconData.Selected == null ? BazookaManager.Instance.GetColorSettingOverlay() : null;
|
|
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(),
|
|
BazookaManager.Instance.GetGameStoreTotalGoldenBerries().ToString(),
|
|
customIconData.Balance.ToString(),
|
|
BazookaManager.Instance.GetAccountName().ToString(),
|
|
BazookaManager.Instance.GetAccountID() ?? 0,
|
|
customIconData.Selected == null ? BazookaManager.Instance.GetBirdIcon() : null,
|
|
customIconData.Selected == null ? BazookaManager.Instance.GetBirdOverlay() : null,
|
|
customIconData.Selected == null ? new Color((int)iconColor[0] / 255f, (int)iconColor[1] / 255f, (int)iconColor[2] / 255f) : Color.white,
|
|
customIconData.Selected == null ? new Color((int)overlayColor[0] / 255f, (int)overlayColor[1] / 255f, (int)overlayColor[2] / 255f) : Color.white,
|
|
customIconData.Selected
|
|
);
|
|
}
|
|
|
|
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;
|
|
var jsonResponse = JObject.Parse(request.downloadHandler.text);
|
|
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);
|
|
}
|
|
}
|
|
|
|
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>();
|
|
inputBox.onSelect.AddListener((_) => inputBox.caretPosition = inputBox.text.Length);
|
|
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);
|
|
}
|
|
}
|
|
} |