NUEVA GESTIÓN DE USUARIOS Y PARTIDAS

This commit is contained in:
2026-05-09 16:23:55 +02:00
parent f64f36b78f
commit a5d24c2721
11 changed files with 606 additions and 81 deletions

View File

@@ -32,6 +32,7 @@ class ClienteSala {
final String nombre;
final bool esHost;
final bool conectado;
final int ultimaActividadMs;
const ClienteSala({
required this.clientId,
@@ -39,6 +40,7 @@ class ClienteSala {
required this.nombre,
this.esHost = false,
this.conectado = true,
this.ultimaActividadMs = 0,
});
ClienteSala copiar({
@@ -47,6 +49,7 @@ class ClienteSala {
String? nombre,
bool? esHost,
bool? conectado,
int? ultimaActividadMs,
}) {
return ClienteSala(
clientId: clientId ?? this.clientId,
@@ -54,6 +57,7 @@ class ClienteSala {
nombre: nombre ?? this.nombre,
esHost: esHost ?? this.esHost,
conectado: conectado ?? this.conectado,
ultimaActividadMs: ultimaActividadMs ?? this.ultimaActividadMs,
);
}
@@ -63,6 +67,7 @@ class ClienteSala {
'nombre': nombre,
'esHost': esHost,
'conectado': conectado,
'ultimaActividadMs': ultimaActividadMs,
};
factory ClienteSala.fromJson(Map<String, dynamic> json) => ClienteSala(
@@ -71,6 +76,7 @@ class ClienteSala {
nombre: json['nombre'] as String,
esHost: json['esHost'] as bool? ?? false,
conectado: json['conectado'] as bool? ?? true,
ultimaActividadMs: (json['ultimaActividadMs'] as num?)?.toInt() ?? 0,
);
}
@@ -121,6 +127,19 @@ class EstadoSalaMultijugador {
int get cantidadUsuariosSeleccionados => usuariosSeleccionados.length;
List<ClienteSala> get clientesDesconectados => clientes.values
.where((cliente) => !cliente.esHost && !cliente.conectado)
.toList();
List<Usuario> get usuariosDeClientesDesconectados {
final desconectados = clientesDesconectados
.map((cliente) => cliente.clientId)
.toSet();
return usuarios.values
.where((usuario) => desconectados.contains(usuario.clienteIdSeleccionado))
.toList();
}
List<Usuario> usuariosPorCliente(String clientId) {
return usuarios.values
.where((usuario) => usuario.clienteIdSeleccionado == clientId)
@@ -235,6 +254,33 @@ class EstadoSalaMultijugador {
}
}
void registrarActividadCliente(String clientId, {int? ahoraMs}) {
final cliente = clientes[clientId];
if (cliente == null) return;
clientes[clientId] = cliente.copiar(
conectado: true,
ultimaActividadMs:
ahoraMs ?? DateTime.now().millisecondsSinceEpoch,
);
}
int reasignarUsuariosDeCliente({
required String clientIdOrigen,
required String clientIdDestino,
}) {
if (!clientes.containsKey(clientIdDestino)) return 0;
var reasignados = 0;
for (final entry in usuarios.entries.toList()) {
if (entry.value.clienteIdSeleccionado == clientIdOrigen) {
usuarios[entry.key] = entry.value.copiar(
clienteIdSeleccionado: clientIdDestino,
);
reasignados++;
}
}
return reasignados;
}
ResultadoOperacionSala validarInicio() {
if (fase != FaseSalaMultijugador.lobby) {
return const ResultadoOperacionSala.error('sala_cerrada');