static async Task PublishRoomEventsAsync(RoomState room) { try { if (room.Action == RoomAction.Leave) { if (!room.TakenSeats.Any()) { room.Action = RoomAction.Enter; } else { await LeaveSeatsAsync(room, random.Next(1, MaxLeaveSeatCount)); } } else { if (!room.EmptySeats.Any()) { room.Action = RoomAction.Leave; } else { await TakeSeatsAsync(room, random.Next(1, MaxTakeSeatCount)); } } } catch (Exception ex) { Console.WriteLine($"Failed to publish events for room '{room.RoomId}'. Details: {ex}"); } }
private static Task LeaveSeatAsync(RoomState room) { // Pick an occupied seat. var seatNumber = room.TakenSeats[random.Next(room.TakenSeats.Count)]; // Mark the seat as taken. room.TakenSeats.Remove(seatNumber); room.EmptySeats.Add(seatNumber); return(room.EventPublisher.PublishEventsAsync(room.RoomId, seatNumber, false)); }
private static async Task TakeSeatsAsync(RoomState room, int count) { for (int i = 0; i < count; i++) { if (!room.EmptySeats.Any()) { return; } await TakeSeatAsync(room); } }