public static void Launch(string[] args, IMonkeyBehaviour monkeyBehaviour)
 {
     Parser.Default.ParseArguments <Options>(args).WithParsed(options =>
     {
         Execute(options, monkeyBehaviour);
     });
 }
        private static async Task RunMonkeys(Options options, IMonkeyBehaviour monkeyBehaviour)
        {
            var logger = CreateLogger(options);

            logger.Log(
                $"Options: {JsonConvert.SerializeObject(options, Formatting.Indented)}{Environment.NewLine}Monkeys, GO!");
            try
            {
                var monkeyFactory = monkeyBehaviour.CreateMonkeyFactory(new ShamanMonkeyLogger(logger), options);
                await LaunchMonkeyGroup(options, logger, monkeyFactory, monkeyBehaviour);
            }
            catch (Exception e)
            {
                logger.Log($"Monkeys gone with troubles {e}");
            }
            finally
            {
                logger.Log("Monkeys gone.");
            }
        }
        private static async Task LaunchMonkeyGroup(Options options, ILogger logger, IMonkeyFactory monkeyFactory, IMonkeyBehaviour monkeyBehaviour)
        {
            var random       = new Random();
            var monkeysCount = GetMonkeysCount(options, random);

            try
            {
                var monkeyGroup = await monkeyFactory.PrepareMonkeys(monkeysCount, options.MonkeysDelay, monkeyBehaviour.Authenticate);

                for (var gameIndex = 0; gameIndex < options.GamesCount || options.GamesCount == 0; gameIndex++)
                {
                    try
                    {
                        var result = await monkeyGroup.SendMonkeys(TimeSpan.FromSeconds(options.RoomPlayDuration), monkeyBehaviour.Play);

                        logger.Log($"Game {gameIndex + 1}:{Environment.NewLine}{result}");
                    }
                    catch (Exception e)
                    {
                        logger.Log($"Error during monkeys play: {e}");
                    }
                }
            }
            catch (Exception e)
            {
                logger.Log($"Error during preparing monkeys: {e}");
            }
        }
 private static void Execute(Options options, IMonkeyBehaviour monkeyBehaviour)
 {
     RunMonkeys(options, monkeyBehaviour).Wait();
 }