public void RemovePendingDisconnectedUser(RoomUser roomUser) { _logger.LogInformation($"removing pending room user {roomUser.Id}"); roomUser.Room.RoomActors.Remove(roomUser); roomUser.Room.RoomUsers.Remove(roomUser); if (roomUser.Room.RoomUsers.Count == 0) //maybe the remaining are bots, or non { _serverLoop.CancelPendingRoomTimeout(roomUser.Room); _sessionRepo.DeleteRoom(roomUser.Room); } _sessionRepo.DeleteRoomUser(roomUser); roomUser.Room = null; }
public async Task FinalizeRoom(Room room) { room.SetUsersDomains(typeof(UserDomain.App.Room.FinishedRoom)); //does this has usage or u can just use lobby idle? LastEat(room); var roomDataUsersUnOrdered = await _masterRepo.GetUsersByIdsAsync(room.RoomActors.Select(_ => _.Id).ToList()); var roomDataUsers = room.RoomActors.Join(roomDataUsersUnOrdered, ru => ru.Id, du => du.Id, (_, du) => du).ToList(); var scores = CalcScores(room.RoomActors); var reportsAndStatus = UpdateUserStates(room, roomDataUsers, scores); for (int i = 0; i < roomDataUsers.Count; i++) { ActiveUser activeUser = room.RoomActors[i] is RoomUser ru ? activeUser = ru.ActiveUser : null; await LevelWorks(roomDataUsers[i], activeUser); } await _masterRepo.SaveChangesAsync(); await SendFinalizeResult(room.RoomUsers, roomDataUsers, reportsAndStatus.Item1, reportsAndStatus.Item2, room.LastEater.TurnId); RemoveDisconnectedUsers(room.RoomUsers); room.RoomUsers.ForEach(ru => _sessionRepo.DeleteRoomUser(ru)); _sessionRepo.DeleteRoom(room); room.SetUsersDomains(typeof(UserDomain.App.Lobby.Idle)); }