using System; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; public static class Cupid { private static string serverAddress; public static string ServerAddress => serverAddress; public static string CupidURI => "http://" + serverAddress + ":" + port; private static int port; public static int Port => port; private static string bearerToken; public static string BearerToken => bearerToken; private static CupidSettings settings = null; public static CupidSettings Settings => settings; public static bool isInitialized => settings != null; public static int RoomPort = -1; public static async Task Init(string _serverAddress, int _port, string _bearerToken) { serverAddress = _serverAddress; port = _port; bearerToken = _bearerToken ?? ""; if (string.IsNullOrEmpty(bearerToken)) { Logger.Log("Cupid: no bearer token; configure auth before matchmaking."); settings = null; return; } using (UnityWebRequest www = UnityWebRequest.Get(CupidURI + "/settings")) { www.SetRequestHeader("Authorization", "Bearer " + bearerToken); var operation = www.SendWebRequest(); while (!operation.isDone) { await Task.Yield(); } try { if (www.result != UnityWebRequest.Result.Success) { Logger.Log("Cupid settings request failed: " + www.error); Logger.Log(www.downloadHandler != null ? www.downloadHandler.text : ""); settings = null; return; } string body = www.downloadHandler != null ? www.downloadHandler.text : ""; if (string.IsNullOrWhiteSpace(body)) { settings = null; return; } settings = JsonUtility.FromJson(body); if (settings == null) { throw new NullReferenceException(); } Logger.Log("Cupid init success"); } catch (Exception e) { Logger.Log("Error retreiving settings from server " + e.Message); Logger.Log(www.downloadHandler != null ? www.downloadHandler.text : ""); settings = null; } } } public static string RandomUsername{ get{ string pool="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; string output =""; for(int i=0; i < 5; i++){ output += pool.ToCharArray()[UnityEngine.Random.Range(0,pool.Length)]; } return output; } } /// Matchmaker GET / body: "0" while waiting; otherwise a JSON room object. public static CupidRoom? ParseRoom(string data) { if (string.IsNullOrWhiteSpace(data)) return null; string t = data.Trim(); if (t == "0") return null; try { CupidRoom room = JsonUtility.FromJson(t); if (room.Port <= 0) return null; return room; } catch { return null; } } } [System.Serializable] public class CupidSettings { public int minimum_players; public int maximum_players; public int waiting_time; } [System.Serializable] public struct CupidRoom { public CupidQueueEntry[] Players; public string GameName; public int Port; public long InitTime; public int match_id; public string your_team; } [System.Serializable] public struct CupidQueueEntry { public string Name; public long LastSeen; public int UserId; }