public override Task <StatsModel> Stats(StatsLookupModel request, ServerCallContext context)
        {
            StatsModel output = new StatsModel();

            // Obtemos o utilizador da base de dados com o ID de sessão, para depois obtermos o seu ID, se não existir é retornado o código
            // de erro para o cliente
            Models.User user = _context.User.FirstOrDefault(u => u.SessionID == request.SessionId);
            if (user == null)
            {
                output.GamesPlayed = -1;
                return(Task.FromResult(output));
            }

            History h = _context.History.FirstOrDefault(u => u.userId == user.Id);

            if (h == null) // No caso do utilizador nunca ter jogado, cria-se uma entrada na base de dados para este jogador.
            {
                _context.Database.EnsureCreated();

                h = new History
                {
                    Games  = 0,
                    win    = 0,
                    lost   = 0,
                    draw   = 0,
                    userId = user.Id
                };



                _context.History.Add(h);
                _context.SaveChanges();
            }

            output.Draws       = h.draw;
            output.GamesPlayed = h.Games;
            output.Losts       = h.lost;
            output.Wins        = h.win;
            output.GamesLeft   = user.GamesToPlay;

            return(Task.FromResult(output));
        }
Beispiel #2
0
        // Método usado para criar uma conexão GRPC com o servidor
        private async void StartGRPCConnection()
        {
            // Estabelece uma conexão com o servidor com o address especificado com o utilizador
            // No caso de não ter sido especificado endereço IP, retorna uma mensagem de erro para a view
            StatsModel stats;

            try
            {
                PlayClient = new Game.GameClient(Program.ConnectionChannel);

                // Após ter sido criada a conexão, é enviada um pedido para obter as estatísticas do jogador, que é usada tanto para
                // testar a conexão e obter as estatísticas do jogador para serem apresentadas na view
                var statsRequest = new StatsLookupModel
                {
                    SessionId = Program.AuthUser.SessionID
                };

                stats = await PlayClient.StatsAsync(statsRequest);
            }
            // No caso de a conexão falhar é apanhada a exceção respetiva, e é apresentada uma mensagem de erro na view
            catch (Grpc.Core.RpcException)
            {
                Program.ConnectController.ConnectionError();
                return;
            }



            // Se o número de jogados for -1 significa que o utilizador com o ID de sessão não existe no servidor
            if (stats.GamesPlayed == -1)
            {
                Program.ConnectController.UserNotFound();
                return;
            }


            // Se a conexão for feita com sucesso, são carregadas as estatísticas para a view, e são ativados os butões para jogar
            Program.PlayView.ShowStats(stats.GamesPlayed, stats.Wins, stats.Draws, stats.Losts, stats.GamesLeft);
            Program.PlayView.EnablePlayButtons();
            return;
        }
Beispiel #3
0
        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");
                }
            }
        }
Beispiel #4
0
        // Método usado para realizar uma jogada
        private async void Play(int play)
        {
            // Se o client estiver a null, significa que ocorreu algum erro, e é finalizada a conexão
            if (PlayClient == null)
            {
                Program.ConnectController.ConnectionError();
                return;
            }

            try
            {
                PlayLookupModel playRequest = new PlayLookupModel
                {
                    SessionId = Program.AuthUser.SessionID,
                    Play      = play
                };

                var outcome = await PlayClient.PlayAsync(playRequest);

                if (outcome.Result == -2)
                {
                    Program.PlayView.UnableToPlayDueToLackOfGames();
                }

                Program.PlayView.ShowGameOutcome(outcome.Result, outcome.ServerPlay);
            }
            // No caso de a conexão falhar é apanhada a exceção respetiva, e é apresentada uma mensagem de erro na view
            catch (Grpc.Core.RpcException)
            {
                Program.PlayView.ResetAndHide();
                Program.ConnectController.ConnectionError();
                return;
            }
            catch (JsonException jsonEx)
            {
                Program.CreditBankMenurView.ShowMessageBox("Unable to play due to json parse exception:\n" + jsonEx + "\nPlayController: Play");
                return;
            }
            catch (ArgumentNullException nullEx)
            {
                Program.CreditBankMenurView.ShowMessageBox("Unable to play due to null exception:\n" + nullEx + "\nPlayController: Play");
                return;
            }
            catch (HttpRequestException httpEx)
            {
                Program.CreditBankMenurView.ShowMessageBox("Unable to play due to Http request exception:\n" + httpEx + "\nPlayController: Play");
                return;
            }


            // Após ter sido feito o pedido para jogar, é feito o pedido para obter os stats do jogador, para serem mostrados
            // a medida que o utilizador vai jogando
            try
            {
                StatsLookupModel statsRequest = new StatsLookupModel
                {
                    SessionId = Program.AuthUser.SessionID
                };

                var outcome = await PlayClient.StatsAsync(statsRequest);

                Program.PlayView.ShowStats(outcome.GamesPlayed, outcome.Wins, outcome.Draws, outcome.Losts, outcome.GamesLeft);
            }
            // No caso de a conexão falhar
            catch (Grpc.Core.RpcException)
            {
                Program.PlayView.ResetAndHide();
                Program.ConnectController.ConnectionError();
                return;
            }
        }