metahunt/Assets/Scripts/Managers/FriendsManager.cs
2024-02-11 13:53:18 +05:30

159 lines
6.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using ExitGames.Client.Photon.StructWrapping;
using Photon.Pun;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class FriendsManager : MonoBehaviour
{
CanvasGroup canvasGroup;
[SerializeField]private GameObject mainPanel;
[SerializeField]private GameObject AddFriendPanel;
[Header("Friend list")]
[SerializeField]private GameObject FriendReqListItemPrefab;
[SerializeField]private GameObject FriendListItemPrefab;
[SerializeField]private GameObject SeperatorListItemPrefab;
[SerializeField]private Transform FriendsListParent;
[SerializeField]private Button ToggleRequestsButton;
[Header("Add Friend")]
[SerializeField]private TMP_InputField AddFriendUsernameInput;
[SerializeField]private TMP_Text AddFriendErrorTxt;
[SerializeField]private Button AddFriendBtn;
void Awake(){
canvasGroup = GetComponent<CanvasGroup>();
AddFriendBtn.onClick.AddListener(AddFriend);
ToggleRequestsButton.onClick.AddListener(ToggleRequests);
Hide();
}
public bool showRequests => ToggleRequestsButton.GetComponentInChildren<TMP_Text>().text == "Hide Requests";
void ToggleRequests(){
if(showRequests){
ToggleRequestsButton.GetComponentInChildren<TMP_Text>().text = "Show Requests";
}else{
ToggleRequestsButton.GetComponentInChildren<TMP_Text>().text = "Hide Requests";
}
PopulateFriendList();
}
void Start(){
UserDataManager.instance.OnFriendsUpdated = PopulateFriendList;
}
public void AddFriend(){
if(AddFriendUsernameInput.text.Length <= 0){
AddFriendErrorTxt.text = "Please enter a valid username";
return;
}
StartCoroutine(CoroutineAddFriend(AddFriendUsernameInput.text));
}
void PopulateFriendList(){
foreach(Photon.Realtime.Player player in PhotonNetwork.PlayerList){
Debug.Log(player.NickName);
}
foreach(Transform t in FriendsListParent.GetComponentsInChildren<Transform>()){
if(t== FriendsListParent){continue;}
Destroy(t.gameObject);
}
if(showRequests){
for(int i=0; i < UserDataManager.instance.FriendRequests.Count; i++){
Friendship friendship = UserDataManager.instance.FriendRequests[i];
if(friendship.provider_username == UserDataManager.instance.Username){continue;}
GameObject newFriendReqListItem = Instantiate(FriendReqListItemPrefab, FriendsListParent);
newFriendReqListItem.GetComponentInChildren<TMP_Text>().text = friendship.provider_username;
newFriendReqListItem.transform.GetChild(1).GetComponent<Button>().onClick.AddListener(()=>{ UserDataManager.instance.AcceptFriendRequest(friendship.id);});
newFriendReqListItem.transform.GetChild(2).GetComponent<Button>().onClick.AddListener(()=>{ UserDataManager.instance.AcceptFriendRequest(friendship.id,true);});
}
Instantiate(SeperatorListItemPrefab, FriendsListParent);
}
for(int i=0; i < UserDataManager.instance.Friends.Count; i++){
GameObject newFriendListItem = Instantiate(FriendListItemPrefab, FriendsListParent);
Friendship friendship = UserDataManager.instance.Friends[i];
string friendName = friendship.provider_username == UserDataManager.instance.Username ? friendship.receiver_username: friendship.provider_username;
int fid = friendship.provider_username == UserDataManager.instance.Username ? friendship.receiver_id : friendship.provider_id;
newFriendListItem.transform.GetChild(0).GetComponent<TMP_Text>().text = friendName;
TimeSpan last_seen_diff = friendship.now - (UserDataManager.instance.Username == friendship.provider_username ? friendship.receiver_last_seen :friendship.provider_last_seen);
bool isOnline =last_seen_diff < new TimeSpan(0,0,15);
newFriendListItem.GetComponent<Image>().color = isOnline ? Color.green : Color.gray;
newFriendListItem.transform.GetChild(1).gameObject.SetActive(isOnline);
newFriendListItem.transform.GetChild(1).GetComponent<Button>().onClick.AddListener(()=>{StartCoroutine(CoroutineInviteFriend(fid));});
newFriendListItem.transform.GetChild(2).gameObject.SetActive(!isOnline);
newFriendListItem.transform.GetChild(2).GetComponent<TMP_Text>().text = "Last seen " + (last_seen_diff.Hours <=0 ? $"{(last_seen_diff.Minutes == 0 ? 1 : last_seen_diff.Minutes)} Mins" : $"{last_seen_diff.Hours} hours") + " Ago";
}
// Photon
}
IEnumerator CoroutineAddFriend(string friendUsername){
canvasGroup.interactable= false;
WWWForm form = new WWWForm();
form.AddField("uid", UserDataManager.instance.UserID);
form.AddField("friend_username", friendUsername);
WWW req= new(UserDataManager.GetApiUrl("friend_request"), form);
yield return req;
AddFriendErrorTxt.text =req.text;
if(req.text.Length <=0){
AddFriendErrorTxt.text ="Server 500";
}
canvasGroup.interactable = true;
}
IEnumerator CoroutineInviteFriend(int fid){
canvasGroup.interactable=false;
WWWForm form = new WWWForm();
form.AddField("uid", UserDataManager.instance.UserID);
form.AddField("fid", fid);
Debug.Log("inviting " + fid + " to this session");
WWW req = new WWW(UserDataManager.GetApiUrl("invite_lobby"),form);
yield return req;
canvasGroup.interactable=true;
Debug.Log("Invite response: " + req.text);
}
public void Show(){
canvasGroup.alpha= 1;
canvasGroup.blocksRaycasts = true;
canvasGroup.interactable=true;
UserDataManager.instance.RefreshFriends();
PopulateFriendList();
}
public void Hide(){
canvasGroup.alpha = 0;
canvasGroup.blocksRaycasts = false;
canvasGroup.interactable = false;
}
public void ShowAddFriendsPanel(){
AddFriendErrorTxt.text ="";
AddFriendUsernameInput.text = "";
mainPanel.SetActive(false);
AddFriendPanel.SetActive(true);
}
public void HideAddFriendsPanel(){
mainPanel.SetActive(true);
AddFriendPanel.SetActive(false);
}
}