static async Task Stream() { PrintInfo("Watching Polls"); var recordHost = GetEnvVariableOrDefault("RECORD_SERVICE_HOST", "localhost"); var recordPort = GetEnvVariableOrDefault("RECORD_SERVICE_PORT", "50000"); var summaryHost = GetEnvVariableOrDefault("SUMMARY_SERVICE_HOST", "localhost"); var summaryPort = GetEnvVariableOrDefault("SUMMARY_SERVICE_PORT", "50000"); var channelRecord = GrpcChannel.ForAddress($"http://{recordHost}:{recordPort}"); var channelSummary = GrpcChannel.ForAddress($"http://{summaryHost}:{summaryPort}"); var clientRecord = new RecordingService.RecordingServiceClient(channelRecord); var clientSummary = new PollSummaryService.PollSummaryServiceClient(channelSummary); var pollsResponse = await clientRecord.GetPollsAsync(new Empty()); if (pollsResponse.Error) { PrintErrorAndExit("Error while getting polls"); return; } if (pollsResponse.Polls.Count == 0) { PrintErrorAndExit("No polls to watch"); return; } var cts = new CancellationTokenSource(); var tasks = new List <Task>(); foreach (var poll in pollsResponse.Polls) { var stream = clientSummary.StreamPollSummary(poll, new CallOptions(cancellationToken: cts.Token)); tasks.Add(ProcessStream(stream)); } Task.WaitAll(tasks.ToArray()); }
static async Task Vote(bool interactive) { var usersHost = GetEnvVariableOrDefault("USERS_SERVICE_HOST", "localhost"); var usersPort = GetEnvVariableOrDefault("USERS_SERVICE_PORT", "50000"); var recordHost = GetEnvVariableOrDefault("RECORD_SERVICE_HOST", "localhost"); var recordPort = GetEnvVariableOrDefault("RECORD_SERVICE_PORT", "50000"); var summaryHost = GetEnvVariableOrDefault("SUMMARY_SERVICE_HOST", "localhost"); var summaryPort = GetEnvVariableOrDefault("SUMMARY_SERVICE_PORT", "50000"); var channelUsers = GrpcChannel.ForAddress($"http://{usersHost}:{usersPort}", new GrpcChannelOptions() { Credentials = ChannelCredentials.Insecure }); var channelRecord = GrpcChannel.ForAddress($"http://{recordHost}:{recordPort}"); var channelSummary = GrpcChannel.ForAddress($"http://{summaryHost}:{summaryPort}"); var clientUsers = new Users.UsersClient(channelUsers); var clientRecord = new RecordingService.RecordingServiceClient(channelRecord); var clientSummary = new PollSummaryService.PollSummaryServiceClient(channelSummary); var userName = ""; if (interactive) { PrintPrompt("Enter a unique display name :"); userName = Console.ReadLine(); } else { var nameGenerator = new PersonNameGenerator(); var firstName = nameGenerator.GenerateRandomFirstName(); var lastName = nameGenerator.GenerateRandomLastName(); userName = $"{firstName.Substring(0, 1).ToUpper()}. {lastName}"; PrintInfo($"Using username : {userName}"); } Console.WriteLine(); PrintInfo($"Calling users service to create a new user {userName}"); var userRequest = new UserRequest { Name = userName }; var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(1)); var userResponse = clientUsers.CreateUser(userRequest, new CallOptions(cancellationToken: cts.Token)); if (userResponse.Error) { PrintError("Error while calling users service"); PrintErrorAndExit(userResponse.ErrorMessage); return; } PrintInfo($"User created with code {userResponse.User.Code}"); var userCode = userResponse.User.Code; PrintInfo("Getting open polls from record service"); var pollsResponse = await clientRecord.GetPollsAsync(new Empty()); if (pollsResponse.Error) { PrintErrorAndExit("Error while getting polls"); return; } PrintInfo($"Got {pollsResponse.Polls.Count}"); if (pollsResponse.Polls.Count == 0) { PrintInfo("Nothing to vote on :("); Console.WriteLine(); } var random = new Random(); foreach (var poll in pollsResponse.Polls) { Voting.Models.Option selectedOption; if (!interactive) { PrintInfo($"Considering Poll : {poll.Summary}"); var randomOptionIdx = random.Next(poll.Options.Count); selectedOption = poll.Options[randomOptionIdx]; } else { PrintInfo($"Cast your vote"); PrintPrompt(poll.Summary); for (var i = 0; i < poll.Options.Count; i++) { PrintPrompt($"{i}) {poll.Options[i].Name}"); } var selectedOptionInput = Console.ReadLine(); var selectedOptionIdx = 0; if (!int.TryParse(selectedOptionInput, out selectedOptionIdx)) { PrintErrorAndExit("Invalid input"); return; } if (selectedOptionIdx < 0 && selectedOptionIdx >= poll.Options.Count) { PrintErrorAndExit("Invalid input"); return; } selectedOption = poll.Options[selectedOptionIdx]; } var vote = new Voting.Models.Vote() { OptionId = selectedOption.Id, PollId = poll.Id, UserCode = userCode, UserId = userName, }; PrintInfo($"Voting for option : {selectedOption.Name}"); PrintInfo("Recording vote"); var recordVoteResponse = await clientRecord.RecordVoteAsync(vote); if (recordVoteResponse.Error) { PrintErrorAndExit($"Error while recording vote : {recordVoteResponse.ErrorMessage}"); return; } var response = await clientSummary.GetPollSummaryAsync(poll); // PrintInfo($"{response.Value.Poll.Summary} : {response.Value.TotalVotes}"); Console.WriteLine(); } }