// Método usado para enviar um pedido para o servidor GRPC com o intuito de registar um utilizador private void Register(string username, string email, string password, string passwordConfirmation) { // Se o client estiver a null, significa que ocorreu algum erro, e é finalizada a conexão if (AuthClient == null) { Program.ConnectController.ConnectionError(); return; } // Verifica se as passwords inseridas são idênticas if (password != passwordConfirmation) { Program.RegisterView.ShowError("The passwords don't match!"); } // Tenta registar o utilizador int validRegistration; try { // Modelo com as informações do pedido para o servidor tratar. UserRegistLookupModel registerRequest = new UserRegistLookupModel { Username = username, Email = email, Password = password }; // Comunicação de forma sincrona com o servidor. Esta comunicação é feita de forma sicrona devido ao mesmo facto do login. var outcome = AuthClient.Regist(registerRequest); validRegistration = outcome.Valid; } // No caso de a conexão com o servidor falhar, é chamado o método de ConnectController para finalizar todas as conexões catch (Grpc.Core.RpcException) { Program.ConnectController.ConnectionError(); return; } catch (JsonException jsonEx) { Program.CreditBankMenurView.ShowMessageBox("Unable to regist in the API due to json parse exception:\n" + jsonEx + "\nAuthController: Register"); return; } catch (ArgumentNullException nullEx) { Program.CreditBankMenurView.ShowMessageBox("Unable to regit in the API due to null exception:\n" + nullEx + "\nAuthController: Register"); return; } catch (HttpRequestException httpEx) { Program.CreditBankMenurView.ShowMessageBox("Unable to regist in the API due to Http request exception:\n" + httpEx + "\nAuthController: Register"); return; } switch (validRegistration) { // Registo feito com sucesso case 1: Program.RegisterView.SuccessfulRegistration(); return; // Já existe uma conta registada com o mesmo username case -1: Program.RegisterView.ShowError("The username is already used!"); return; // Já existe uma conta registada com o mesmo email case -2: Program.RegisterView.ShowError("The email is already used!"); return; // Já existe uma conta registada com o mesmo username e mail case -3: Program.RegisterView.ShowError("The username and email are already taken!"); return; // Erro desconhecido default: Program.RegisterView.ShowError("Unknown error!"); return; } }
static async Task Main(string[] args) { Boolean valido1 = false; String loginOuRegisto = ""; int userDBId = -1; while (!valido1) { Console.WriteLine("Antes de continuar, já tem conta ou não (Y/N)?\n"); loginOuRegisto = Console.ReadLine(); loginOuRegisto.ToUpper(); if ((loginOuRegisto.Equals("N") || loginOuRegisto.Equals("Y"))) { valido1 = true; } } String username, password, email, confirmacaoPassword; Boolean valido = false; loginOuRegisto.ToUpper(); while (!valido) { if (loginOuRegisto.Equals("Y")) { Console.WriteLine("\nUsername: "******"\nPassword: "******"https://localhost:5001"); var client = new User.UserClient(channel); var reply = await client.LoginAsync(clientRequest); valido = reply.Valid; // Caso a autenticação seja bem sucedida, o valor retornado é true. Quando o valor da variavel "valido" é true, a execução já não entrará novamente no ciclo while, passando para a nova fase. if (valido) { Console.WriteLine("\nEstás autenticado! "); userDBId = reply.UserId; } else { Console.WriteLine("\nNão estás autenticado! "); } } else if (loginOuRegisto.Equals("N")) { Console.WriteLine("\nUsername: "******"\nEmail: "); email = Console.ReadLine(); Console.WriteLine("\nPassword: "******"\nConfirmação da password: "******"\nO campo Pasword e o de confirmação de password não são iguais. Tente novamente."); continue; } // Verificar a existência destes valores na base de dados do servidor e registar o utilizador. var clientRequest = new UserRegistLookupModel { Username = username, Email = email, Password = password }; var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new User.UserClient(channel); var reply = await client.RegistAsync(clientRequest); valido = reply.Valid; // Caso o registo seja bem sucedida, o valor retornado é true. Quando o valor da variavel "valido" é true, a execução já não entrará novamente no ciclo while, passando para a nova fase. if (!valido) { Console.WriteLine("\nErro no registo! "); } else { valido = false; loginOuRegisto = "Y"; // Vai continuar no ciclo, mas desta vez para fazer a autenticação. } } } Console.WriteLine("Agora que está autenticado, vamos jogar!\n"); Console.WriteLine("Comandos possíveis:\n"); Console.WriteLine("\t -> play pedra: Jogada pedra;\n"); Console.WriteLine("\t -> play tesoura: jogada tesoura;\n"); Console.WriteLine("\t -> play papel: Jogada papel;\n"); Console.WriteLine("\t -> stats: Ver as suas estatísticas;\n"); Console.WriteLine("\t -> end: Finalizar o jogo;\n"); Console.WriteLine("\t -> help: Ver esta tabela novamente;\n"); bool validoJogo = true; while (validoJogo) { string input = Console.ReadLine(); var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Game.GameClient(channel); if (input.Equals("play pedra")) { var clientRequest = new PlayLookupModel { UserId = userDBId, Play = 1 }; var reply = await client.PlayAsync(clientRequest); if (reply.Result == 1) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O cliente ganhou!\n\n"); } else if (reply.Result == 2) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O servidor ganhou!\n\n"); } else if (reply.Result == 0) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: Empate!\n\n"); } } else if (input.Equals("play papel")) { var clientRequest = new PlayLookupModel { UserId = userDBId, Play = 2 }; var reply = await client.PlayAsync(clientRequest); if (reply.Result == 1) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O cliente ganhou!\n\n"); } else if (reply.Result == 2) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O servidor ganhou!\n\n"); } else if (reply.Result == 0) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: Empate!\n\n"); } } else if (input.Equals("play tesoura")) { var clientRequest = new PlayLookupModel { UserId = userDBId, Play = 3 }; var reply = await client.PlayAsync(clientRequest); if (reply.Result == 1) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O cliente ganhou!\n\n"); } else if (reply.Result == 2) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: O servidor ganhou!\n\n"); } else if (reply.Result == 0) { Console.WriteLine("Resumo do jogo:\n\tCliente: Pedra\n\tServidor: " + reply.ServerPlay + "\n\tResultado final: Empate!\n\n"); } } else if (input.Equals("stats")) { if (userDBId != -1) { var clientRequest = new StatsLookupModel { UserId = userDBId }; var reply = await client.StatsAsync(clientRequest); Console.WriteLine("\nAs suas estatísticas:\n\t-> Jogos feitos: " + reply.GamesPlayed.ToString() + "\n\t->Ganhos: " + reply.Wins.ToString() + "\n\t->Perdidos: " + reply.Losts.ToString() + "\n\t->Empatados: " + reply.Draws.ToString() + "\n\n"); } } else if (input.Equals("end")) { // TODO: Fechar conexão com o gRPC validoJogo = false; } else if (input.Equals("help")) { Console.WriteLine("Comandos possíveis:\n"); Console.WriteLine("\t -> play rock: Jogada pedra;\n"); Console.WriteLine("\t -> play scissors: jogada tesoura;\n"); Console.WriteLine("\t -> play paper: Jogada papel;\n"); Console.WriteLine("\t -> stats: Ver as suas estatísicas;\n"); Console.WriteLine("\t -> end: Finalizar o jogo;\n"); Console.WriteLine("\t -> help: Ver esta tabela novamente;\n"); } else { Console.WriteLine("Comando inválido"); } } }
/** * Registo de novos utilizadores. Devem ser recebidos o username, email e password para criar o novo utilizador. * Quando é guardado um novo utilizador na base de dados, o email e username são transformados em upper case, e * a password é encriptada. */ public async override Task <UserRegistModel> Regist(UserRegistLookupModel request, ServerCallContext context) { UserRegistModel output = new UserRegistModel(); // Transformação dos carateres do email e username para upper case string email = request.Email.ToUpper(); string username = request.Username;//.ToUpper(); // Verificações se um outro utilizador tem o mesmo email e/ou o mesmo username Models.User u1 = new Models.User(), u2 = new Models.User(); u1 = _context.User.FirstOrDefault(u => u.Username == username); u2 = _context.User.FirstOrDefault(u => u.Email == email); // Um utilizador tem o mesmo username if (u1 != null) { if (u2 == null) { output.Valid = -3; // Um utilizador tem apenas o mesmo username } else { output.Valid = -1; // Um utilizador tem o mesmo username e email } } // Um utilizador tem o mesmo email else if (u2 != null) { output.Valid = -2; // Um utilizador tem apenas o mesmo email } // Nenhum utilizador tem o mesmo username e/ou email else { // Encriptação da password SHA512 sha512 = SHA512Managed.Create(); byte[] bytes = sha512.ComputeHash(Encoding.UTF8.GetBytes(request.Password)); string password = Convert.ToBase64String(bytes); Models.User u = new Models.User { Username = username, Email = email, Password = password }; // Verifica e garante que a BD existe _context.Database.EnsureCreated(); // Guarda-se o novo utilizador na base de dados _context.User.Add(u); _context.SaveChanges(); // Regista o utilizador no banco de créditos await APIServerCommunication.RegisterUser(u.Username, u.Id); // Envia-se uma mensagem uma mensagem de confirmação de registo ao cliente output.Valid = 1; } return(await Task.FromResult(output)); }