2024-01-27 18:58:02 +00:00
|
|
|
using System;
|
2024-01-27 09:19:32 +00:00
|
|
|
using System.Collections.Generic;
|
2024-01-28 01:40:38 +00:00
|
|
|
using System.Linq;
|
2024-01-27 18:54:06 +00:00
|
|
|
using Newtonsoft.Json;
|
2024-01-28 15:13:25 +00:00
|
|
|
using Newtonsoft.Json.Linq;
|
2024-01-29 19:18:09 +00:00
|
|
|
using UnityEngine;
|
2024-01-27 09:19:32 +00:00
|
|
|
|
2024-01-27 18:58:02 +00:00
|
|
|
[Serializable]
|
2024-01-27 19:05:24 +00:00
|
|
|
[JsonObject]
|
2024-01-27 09:19:32 +00:00
|
|
|
public class Room
|
|
|
|
{
|
|
|
|
public string code;
|
2024-01-28 15:13:25 +00:00
|
|
|
|
|
|
|
[JsonConverter(typeof(ArrayToDictionaryConverter<Question>))]
|
2024-01-28 14:42:32 +00:00
|
|
|
public Dictionary<int, Question> questions;
|
2024-01-27 18:54:06 +00:00
|
|
|
public Dictionary<string, Player> players;
|
2024-01-28 16:34:11 +00:00
|
|
|
public int currentQuestionId;
|
2024-01-27 14:08:12 +00:00
|
|
|
public double creationDate;
|
2024-01-27 21:26:23 +00:00
|
|
|
public int currentState;
|
2024-02-29 20:34:05 +00:00
|
|
|
public string promptsLanguage;
|
2024-01-27 14:08:12 +00:00
|
|
|
|
|
|
|
public Room(string _code)
|
|
|
|
{
|
2024-01-27 18:58:02 +00:00
|
|
|
code = _code;
|
|
|
|
creationDate = DateTime.Now.ToOADate();
|
2024-01-27 18:59:51 +00:00
|
|
|
players = new Dictionary<string, Player>();
|
2024-01-28 14:42:32 +00:00
|
|
|
questions = new Dictionary<int, Question>();
|
2024-01-28 16:34:11 +00:00
|
|
|
currentQuestionId = 0;
|
2024-01-27 23:06:23 +00:00
|
|
|
currentState = 1; //default by PC
|
2024-02-29 20:34:05 +00:00
|
|
|
promptsLanguage = "en";
|
2024-01-27 14:08:12 +00:00
|
|
|
}
|
2024-01-27 18:54:06 +00:00
|
|
|
|
2024-02-04 12:21:39 +00:00
|
|
|
public Room Copy()
|
|
|
|
{
|
|
|
|
Room newRoom = new Room(this.code)
|
|
|
|
{
|
|
|
|
questions = new Dictionary<int, Question>(this.questions),
|
|
|
|
players = new Dictionary<string, Player>(this.players),
|
|
|
|
currentQuestionId = this.currentQuestionId,
|
|
|
|
creationDate = this.creationDate,
|
|
|
|
currentState = this.currentState
|
|
|
|
};
|
|
|
|
|
|
|
|
return newRoom;
|
|
|
|
}
|
|
|
|
|
2024-01-28 12:18:40 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Return the only player with a specific ID
|
|
|
|
/// </summary>
|
|
|
|
/// <returns></returns>
|
|
|
|
public Player GetPlayerById(string id)
|
|
|
|
{
|
|
|
|
return players[id];
|
|
|
|
}
|
|
|
|
|
2024-02-01 21:45:02 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Get the order of arrival of a player (the first player is 0, the last to connect is player.count-1)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="p">The player you want to know the position of</param>
|
|
|
|
/// <returns>the position by arrival order</returns>
|
|
|
|
public int GetPlayerOrder(Player p)
|
|
|
|
{
|
|
|
|
return GetOrderedPlayerList().FindIndex(x => x.id == p.id);
|
|
|
|
}
|
|
|
|
|
2024-01-27 18:54:06 +00:00
|
|
|
public List<Player> GetPlayerList()
|
|
|
|
{
|
|
|
|
return new List<Player>(players.Values);
|
|
|
|
}
|
|
|
|
|
2024-01-28 01:40:38 +00:00
|
|
|
/// <summary>
|
|
|
|
/// return the list of player ordered by who joined first
|
|
|
|
/// </summary>
|
|
|
|
/// <returns></returns>
|
|
|
|
public List<Player> GetOrderedPlayerList()
|
|
|
|
{
|
|
|
|
return players.Values.OrderBy(x => x.creationDate).ToList();
|
|
|
|
}
|
|
|
|
|
2024-01-28 01:40:12 +00:00
|
|
|
public List<Question> GetQuestionsByPlayer(Player player)
|
|
|
|
{
|
2024-01-28 14:42:32 +00:00
|
|
|
List<Question> playerQuestions = new();
|
2024-01-28 01:40:12 +00:00
|
|
|
|
2024-01-29 19:18:09 +00:00
|
|
|
foreach (Question question in questions.Values.ToList())
|
2024-01-28 01:40:12 +00:00
|
|
|
{
|
2024-01-29 19:18:09 +00:00
|
|
|
foreach (Proposition proposition in question.propositions.Values.ToList())
|
2024-01-28 01:40:12 +00:00
|
|
|
{
|
|
|
|
if (proposition.owner.id == player.id)
|
|
|
|
{
|
2024-01-28 14:42:32 +00:00
|
|
|
playerQuestions.Add(question);
|
2024-01-28 01:40:12 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-28 14:42:32 +00:00
|
|
|
return playerQuestions;
|
2024-01-28 01:40:12 +00:00
|
|
|
}
|
|
|
|
|
2024-01-28 01:26:57 +00:00
|
|
|
|
2024-01-28 01:40:12 +00:00
|
|
|
public void SetPlayersAreReady(int _state)
|
2024-01-27 21:26:23 +00:00
|
|
|
{
|
|
|
|
currentState = _state;
|
|
|
|
}
|
2024-01-28 01:40:38 +00:00
|
|
|
|
2024-01-31 21:34:50 +00:00
|
|
|
/// <summary>
|
|
|
|
/// Return all the propositions linked to a specific player.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="player"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public List<Proposition> GetPropositionsForPlayer(Player player)
|
2024-01-28 01:40:38 +00:00
|
|
|
{
|
2024-01-28 14:42:32 +00:00
|
|
|
List<Proposition> playerPropositions = new();
|
2024-01-28 01:40:38 +00:00
|
|
|
|
2024-01-29 19:18:09 +00:00
|
|
|
foreach (Question question in questions.Values.ToList())
|
2024-01-28 01:40:38 +00:00
|
|
|
{
|
2024-01-29 19:18:09 +00:00
|
|
|
foreach (Proposition proposition in question.propositions.Values.ToList())
|
2024-01-28 01:40:38 +00:00
|
|
|
{
|
|
|
|
if (proposition.owner.id == player.id)
|
|
|
|
{
|
2024-01-28 14:42:32 +00:00
|
|
|
playerPropositions.Add(proposition);
|
2024-01-28 01:40:38 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-01-28 14:42:32 +00:00
|
|
|
return playerPropositions;
|
2024-01-28 01:40:38 +00:00
|
|
|
}
|
2024-02-01 21:38:34 +00:00
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Return the number of voters for a specific question
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="_question"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public int NumbersOfVotersForQuestion(Question _question)
|
|
|
|
{
|
|
|
|
int numberOfVoters = 0;
|
|
|
|
|
|
|
|
foreach(Proposition proposition in _question.propositions.Values.ToList())
|
|
|
|
{
|
|
|
|
if (proposition.voters == null)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
numberOfVoters += proposition.voters.Count;
|
|
|
|
}
|
|
|
|
|
|
|
|
return numberOfVoters;
|
|
|
|
}
|
2024-01-27 09:19:32 +00:00
|
|
|
}
|
2024-01-27 18:54:06 +00:00
|
|
|
|
2024-01-28 15:13:25 +00:00
|
|
|
public class ArrayToDictionaryConverter<T> : JsonConverter<Dictionary<int, T>>
|
|
|
|
{
|
|
|
|
public override Dictionary<int, T> ReadJson(JsonReader reader, Type objectType, Dictionary<int, T> existingValue, bool hasExistingValue, JsonSerializer serializer)
|
|
|
|
{
|
|
|
|
if (reader.TokenType == JsonToken.StartArray)
|
|
|
|
{
|
|
|
|
var jsonArray = JArray.Load(reader);
|
|
|
|
var dictionary = new Dictionary<int, T>();
|
|
|
|
|
|
|
|
for (int i = 0; i < jsonArray.Count; i++)
|
|
|
|
{
|
|
|
|
var item = jsonArray[i].ToObject<T>(serializer);
|
|
|
|
dictionary.Add(i, item);
|
|
|
|
}
|
|
|
|
|
|
|
|
return dictionary;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void WriteJson(JsonWriter writer, Dictionary<int, T> value, JsonSerializer serializer)
|
|
|
|
{
|
|
|
|
if (value != null)
|
|
|
|
{
|
|
|
|
var jsonArray = new JArray();
|
|
|
|
|
|
|
|
foreach (var kvp in value)
|
|
|
|
{
|
|
|
|
var itemJson = JToken.FromObject(kvp.Value, serializer);
|
|
|
|
jsonArray.Add(itemJson);
|
|
|
|
}
|
|
|
|
|
|
|
|
jsonArray.WriteTo(writer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|