snakes_mp/Assets/Scripts/MenuManager.cs
2025-04-14 11:36:17 +05:30

182 lines
6.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class MenuManager : MonoBehaviourPunCallbacks
{
public GameObject connectingPanel;
public TMP_Text ownerUsernameTxt;
public Image ownerProfiPicImage;
public TMP_Text joinerUsernameTxt;
public Image joinerProfilePicImage;
void ConnectPhoton(){
connectingPanel.SetActive(true);
PhotonNetwork.AuthValues = new AuthenticationValues();
PhotonNetwork.AuthValues.UserId = GameData.user_id;
PhotonNetwork.ConnectUsingSettings();
}
float timeoutTimer =25;
void Update(){
if(timeoutTimer > 0){
timeoutTimer -= Time.deltaTime;
if(timeoutTimer <= 0){
SceneManager.LoadScene(0);
}
}
}
void Start()
{
if(PhotonNetwork.IsConnected){
connectingPanel.SetActive(false);
}else{
}
string url = Application.absoluteURL;
if (!string.IsNullOrEmpty(url))
{
// Extract query parameters
string betId = GetQueryParam(url, "betId");
string owner = GetQueryParam(url, "owner");
string joiner = GetQueryParam(url, "joiner");
string address = GetQueryParam(url, "address");
string user_id = GetQueryParam(url, "uid");
string pubkey = GetQueryParam(url, "pubkey");
int wager = int.Parse(GetQueryParam(url, "wager"));
GameData.id = betId;
GameData.ownerId= owner;
GameData.joinerId = joiner;
GameData.address = address;
GameData.user_id = user_id;
GameData.pubkey = pubkey;
GameData.wager = wager;
ConnectPhoton();
StartCoroutine(CoroutineUpdateGameData());
}else{
string betId = "tetris";
string owner = "did:privy:cm8tsahek00mdb857e0a7igd3" + Random.Range(1,100);
string joiner = "did:privy:cm8u2diob01cu14c92y4yq5pf";
string address = "3NEY7LD9gL7cgwZ6Lw6dNjmnthdkqtStYmaQUCTiDRFk";
string pubkey = "cocD4r4yNpHxPq7CzUebxEMyLki3X4d2Y3HcTX5ptUc";
string user_id = owner;
GameData.id = betId;
GameData.ownerId= owner;
GameData.joinerId = joiner;
GameData.address = address;
GameData.user_id = user_id;
GameData.pubkey = pubkey;
ConnectPhoton();
StartCoroutine(CoroutineUpdateGameData());
}
}
IEnumerator CoroutineUpdateGameData()
{
// Request user profile data for both owner and joiner
UnityWebRequest ownerDataReq = UnityWebRequest.Get($"{Constants.API_URL}get_user_by_id.php?id={GameData.ownerId}");
UnityWebRequest joinerDataReq = UnityWebRequest.Get($"{Constants.API_URL}get_user_by_id.php?id={GameData.joinerId}");
// Wait for both requests to finish
yield return ownerDataReq.SendWebRequest();
yield return joinerDataReq.SendWebRequest();
// Handle errors if any
if (ownerDataReq.result != UnityWebRequest.Result.Success || joinerDataReq.result != UnityWebRequest.Result.Success)
{
Debug.LogError($"Error fetching data: {ownerDataReq.error}, {joinerDataReq.error}");
yield break;
}
// Parse the response data into UserProfile objects
try{
UserProfile ownerProfile = JsonUtility.FromJson<UserProfile>(ownerDataReq.downloadHandler.text);
UserProfile joinerProfile = JsonUtility.FromJson<UserProfile>(joinerDataReq.downloadHandler.text);
// Update username text
ownerUsernameTxt.text = ownerProfile.username;
joinerUsernameTxt.text = joinerProfile.username;
// Load the profile images using UnityWebRequest
StartCoroutine(LoadProfileImage(ownerProfile.x_profile_url, ownerProfiPicImage));
StartCoroutine(LoadProfileImage(joinerProfile.x_profile_url, joinerProfilePicImage));
}catch{}
yield return new WaitForSeconds(2f);
if(connectingPanel.activeSelf){
yield return new WaitForSeconds(2f);
}
PhotonNetwork.JoinOrCreateRoom(GameData.address, new Photon.Realtime.RoomOptions(){MaxPlayers=2}, Photon.Realtime.TypedLobby.Default);
}
// Helper method to load an image from a URL and set it to an Image component
IEnumerator LoadProfileImage(string url, Image imageComponent)
{
UnityWebRequest imageRequest = UnityWebRequestTexture.GetTexture(url);
yield return imageRequest.SendWebRequest();
if (imageRequest.result == UnityWebRequest.Result.Success)
{
Texture2D texture = ((DownloadHandlerTexture)imageRequest.downloadHandler).texture;
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
imageComponent.sprite = sprite;
}
else
{
Debug.LogError($"Error loading image from {url}: {imageRequest.error}");
}
}
public override void OnConnectedToMaster()
{
base.OnConnectedToMaster();
connectingPanel.SetActive(false);
}
public void Play(){
PhotonNetwork.JoinRandomOrCreateRoom(new ExitGames.Client.Photon.Hashtable(), 2);
connectingPanel.SetActive(true);
}
public override void OnJoinedRoom()
{
base.OnJoinedRoom();
SceneManager.LoadScene("Game");
}
string GetQueryParam(string url, string key)
{
if (!url.Contains("?")) return null;
string[] queries = url.Split('?')[1].Split('&');
foreach (string query in queries)
{
string[] pair = query.Split('=');
if (pair.Length == 2 && pair[0] == key) return pair[1];
}
return null;
}
}