185 lines
7.3 KiB
C#
185 lines
7.3 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;
|
|
|
|
|
|
public static FriendsManager instance;
|
|
void Awake(){
|
|
instance = this;
|
|
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));
|
|
AddFriendUsernameInput.text = "";
|
|
}
|
|
|
|
public void OnPlayersChanged(){
|
|
PopulateFriendList();
|
|
}
|
|
|
|
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(1).GetComponent<Button>().interactable = PhotonNetwork.CurrentRoom.PlayerCount < 3;
|
|
|
|
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;
|
|
string pureq = req.text.Replace(" ", "");
|
|
if(pureq == "0" || pureq == "1"){
|
|
//Success
|
|
AddFriendPanel.SetActive(false);
|
|
mainPanel.SetActive(true);
|
|
}else if(pureq == "7"){
|
|
AddFriendErrorTxt.text ="Invalid username";
|
|
}else if(pureq == "5"){
|
|
AddFriendErrorTxt.text ="You guys are already friends!";
|
|
}else if(pureq == "4"){
|
|
AddFriendErrorTxt.text ="You've already sent a friend request to this user";
|
|
}else{
|
|
AddFriendErrorTxt.text ="Something went wrong";
|
|
}
|
|
|
|
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);
|
|
form.AddField("lobby", PhotonNetwork.CurrentRoom.Name);
|
|
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);
|
|
}
|
|
}
|