Esempio n. 1
0
        public void Options_Test_NewUserShowStatistics()
        {
            RpsPlayData player = CreatePlayer("r");

            Embed       e            = _rps.Options(CreatePlayer("s"));
            var         fields       = e.Fields;
            RpsUserData actualUser   = (RpsUserData)_fileSystem.Load().ElementAt(0);
            RpsUserData expectedUser = new RpsUserData
            {
                Plays          = int.Parse(fields.First(x => x.Name == "Plays").Value),
                TotalPlays     = int.Parse(fields.First(x => x.Name == "Total Plays").Value),
                Wins           = int.Parse(fields.First(x => x.Name == "Wins").Value),
                Losses         = int.Parse(fields.First(x => x.Name == "Losses").Value),
                Draws          = int.Parse(fields.First(x => x.Name == "Draws").Value),
                Ratio          = int.Parse(fields.First(x => x.Name == "Win Ratio").Value),
                CurrentStreak  = int.Parse(fields.First(x => x.Name == "Current Streak").Value),
                BestStreak     = int.Parse(fields.First(x => x.Name == "Best Streak").Value),
                Resets         = int.Parse(fields.First(x => x.Name == "Resets").Value),
                RockChosen     = int.Parse(fields.First(x => x.Name == ":rock:").Value),
                PaperChosen    = int.Parse(fields.First(x => x.Name == ":roll_of_paper:").Value),
                ScissorsChosen = int.Parse(fields.First(x => x.Name == ":scissors:").Value),
                Coins          = int.Parse(fields.First(x => x.Name == "Rings").Value)
            };

            Equal(actualUser, 345678912, expectedUser.Plays, expectedUser.TotalPlays, expectedUser.Wins,
                  expectedUser.Losses, expectedUser.Draws, expectedUser.Ratio,
                  expectedUser.CurrentStreak, expectedUser.BestStreak,
                  expectedUser.Resets, expectedUser.RockChosen, expectedUser.PaperChosen,
                  expectedUser.ScissorsChosen, expectedUser.Coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 2
0
        public void PlayVsBot_Test_BonusStreak()
        {
            RpsPlayData player     = CreatePlayer("p");
            const int   playsTimes = 11;
            int         coins      = 0;

            for (int i = 0; i < playsTimes; i++)
            {
                _rps.Play(player, null, RpsActors.Rock);
            }
            RpsUserData user = (RpsUserData)_fileSystem.Load().ElementAt(0);

            for (int i = 1; i < playsTimes + 1; i++)
            {
                int bonus = 1;
                if (i % 10 == 0)
                {
                    bonus = i * 2;
                }
                coins += (int)Math.Ceiling(bonus * 0.5f);
            }

            Equal(user, 345678912, playsTimes, playsTimes, playsTimes, ratio: 100, currentStreak: playsTimes,
                  paperChosen: playsTimes, coins: coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 3
0
        public async Task PlayAsync(string actor, string mention = null)
        {
            if (Context.Message.Content.Contains("|"))
            {
                actor = actor.Replace("|", "");
            }

            RpsPlayData playData = CreatePlayData(Context.Message.Author.Id, actor, Context.Message.Author.Mention,
                                                  Context.Message.Author.Username, Context.User.GetAvatarUrl() ?? Context.User.GetDefaultAvatarUrl());

            RpsPlayData?mentionData = null;

            if (mention != null && Context.Message.MentionedUsers.Count > 0)
            {
                var mentionUser = Context.Message.MentionedUsers.ElementAt(0);
                mentionData = CreatePlayData(mentionUser.Id, actor, mentionUser.Mention, mentionUser.Username,
                                             mentionUser.GetAvatarUrl() ?? mentionUser.GetDefaultAvatarUrl());
            }

            var result = _rps.Play(playData, mentionData);

            if (result.Description.Contains("Wrong input"))
            {
                await SendMessage(result.Description);
            }
            else
            {
                await _client.GetGuild(Context.Guild.Id).GetTextChannel(Context.Channel.Id)
                .DeleteMessageAsync(Context.Message);
                await SendMessage(result);
            }
        }
Esempio n. 4
0
        private Embed ShowStats(RpsPlayData playData)
        {
            if (!Exists(playData.UserId, out RpsUserData ud))
            {
                ud = CreateUser(playData);
            }

            string plural = ud.Coins == 1 ? string.Empty : "s";
            var    embed  = new EmbedBuilder()
                            .WithAuthor(TitleBuilder(playData))
                            .WithTitle($"Statistics for {playData.Username}")
                            .WithFields(new EmbedFieldBuilder {
                Name = "Plays", Value = ud.Plays, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Total Plays", Value = ud.TotalPlays, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Wins", Value = ud.Wins, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Losses", Value = ud.Losses, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Draws", Value = ud.Draws, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Win Ratio", Value = ud.Ratio, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Current Streak", Value = ud.CurrentStreak, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Best Streak", Value = ud.BestStreak, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = "Resets", Value = ud.Resets, IsInline = true
            },
                                        new EmbedFieldBuilder
            {
                Name = ConvertActorToEmoji(RpsActors.Rock), Value = ud.RockChosen, IsInline = true
            },
                                        new EmbedFieldBuilder
            {
                Name = ConvertActorToEmoji(RpsActors.Paper), Value = ud.PaperChosen, IsInline = true
            },
                                        new EmbedFieldBuilder
            {
                Name = ConvertActorToEmoji(RpsActors.Scissors), Value = ud.ScissorsChosen, IsInline = true
            },
                                        new EmbedFieldBuilder {
                Name = $"Ring{plural}", Value = ud.Coins
            });

            return(embed.Build());
        }
Esempio n. 5
0
        public void Options_Test_NewUserReset()
        {
            RpsPlayData player = CreatePlayer("r");

            Embed e = _rps.Options(player);

            Assert.Equal($"Stats for {player.Username} has been reset.", e.Title);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 6
0
        public void Play_Test_WrongInput()
        {
            RpsPlayData player = CreatePlayer("f");

            Embed e = _rps.Play(player, null);

            Assert.Equal("Wrong input. \nType either rock(r), paper(p), or scissors(s) to play.", e.Description);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 7
0
        public void PlayVsSelf_Test()
        {
            RpsPlayData player = CreatePlayer("p");

            Embed e = _rps.Play(player, player);

            Assert.Equal($"{player.Mention} If you have two hands, you can play against yourself that way.", e.Description);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 8
0
        public void Options_Test_WrongInput()
        {
            RpsPlayData player = CreatePlayer("f");

            Embed e = _rps.Options(player);

            Assert.Equal("Wrong input. \nType stats/s to show your statistics.\nType reset/r to reset the statistics.", e.Description);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 9
0
        public void PlayVsBot_Test_Draw()
        {
            RpsPlayData player = CreatePlayer("r");

            _rps.Play(player, null, RpsActors.Rock);
            RpsUserData user = (RpsUserData)_fileSystem.Load().ElementAt(0);

            Equal(user, 345678912, 1, 1, draws: 1, rockChosen: 1);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 10
0
        public void PlayVsBot_Test_Win()
        {
            RpsPlayData player = CreatePlayer("r");

            _rps.Play(player, null, RpsActors.Scissors);
            RpsUserData user = (RpsUserData)_fileSystem.Load().ElementAt(0);

            Equal(user, 345678912, 1, 1, 1, ratio: 100, currentStreak: 1, rockChosen: 1, coins: 1);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 11
0
        public void PlayVsPlayer_Test_AlreadyInBattle()
        {
            RpsPlayData player1 = CreatePlayer("r");
            RpsPlayData player2 = CreatePlayer("s", "Testa", "Test321", 147258369);

            _rps.Play(player1, player2);
            Embed e = _rps.Play(player1, player2);

            Assert.Equal($"{player2.Username} is already in battle.", e.Title);

            DeleteFile(player1.GuildId + ".xml");
        }
Esempio n. 12
0
        public void PlayVsBot_Test_WinRatio()
        {
            RpsPlayData player = CreatePlayer("p");

            _rps.Play(player, null, RpsActors.Rock);
            _rps.Play(player, null, RpsActors.Scissors);
            RpsUserData user = (RpsUserData)_fileSystem.Load().ElementAt(0);

            Equal(user, 345678912, user.Plays, user.TotalPlays, user.Wins, user.Losses,
                  ratio: 50, bestStreak: user.BestStreak, paperChosen: user.PaperChosen, coins: user.Coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 13
0
        public void PlayVsBot_Test_PlayWithEachActor()
        {
            RpsPlayData player = CreatePlayer("r");

            _rps.Play(player, null);
            _rps.Play(CreatePlayer("p"), null);
            _rps.Play(CreatePlayer("s"), null);
            RpsUserData user = (RpsUserData)_fileSystem.Load().ElementAt(0);

            Equal(user, 345678912, 3, 3, user.Wins, user.Losses, user.Draws, user.Ratio, user.CurrentStreak, rockChosen: 1,
                  paperChosen: 1, scissorsChosen: 1, coins: user.Coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 14
0
        public void PlayVsPlayer_Test_InstigatorWins()
        {
            RpsPlayData player1 = CreatePlayer("s");
            RpsPlayData player2 = CreatePlayer("p", "Testa", "Test321", 147258369);

            _rps.Play(player1, player2);
            _rps.Play(player2, player1);
            var         users = (List <RpsUserData>)_fileSystem.Load();
            RpsUserData user1 = users.Find(x => x.UserId == 345678912);
            RpsUserData user2 = users.Find(x => x.UserId == 147258369);

            Equal(user2, 147258369, 1, 1, losses: 1, paperChosen: 1);
            Equal(user1, 345678912, 1, 1, 1, ratio: 100, currentStreak: 1, scissorsChosen: 1, coins: 1);

            DeleteFile(player1.GuildId + ".xml");
        }
Esempio n. 15
0
        public Embed Play(RpsPlayData authorData, RpsPlayData?mentionData, RpsActors botActor = RpsActors.Max)
        {
            RpsActors rpsActor = ConvertInputIntoActor(authorData.Input);

            if (rpsActor == RpsActors.Max)
            {
                return(new EmbedBuilder().WithDescription("Wrong input. \nType either rock(r), paper(p), or scissors(s) to play.").Build());
            }

            if (mentionData.HasValue)
            {
                return(VsPlayer(authorData, mentionData.Value));
            }

            return(VsBot(authorData, botActor));
        }
Esempio n. 16
0
        public void PlayVsPlayer_Test_Draw()
        {
            RpsPlayData player1 = CreatePlayer("r");
            RpsPlayData player2 = CreatePlayer("r", "Testa", "Test321", 147258369);

            _rps.Play(player1, player2);
            _rps.Play(player2, player1);
            var         users = (List <RpsUserData>)_fileSystem.Load();
            RpsUserData user1 = users.Find(x => x.UserId == 345678912);
            RpsUserData user2 = users.Find(x => x.UserId == 147258369);

            Equal(user1, 345678912, 1, 1, draws: 1, rockChosen: 1);
            Equal(user2, 147258369, 1, 1, draws: 1, rockChosen: 1);

            DeleteFile(player1.GuildId + ".xml");
        }
Esempio n. 17
0
        public Embed Options(RpsPlayData playData)
        {
            switch (playData.Input)
            {
            case "s":
            case "stats":
                return(ShowStats(playData));

            case "r":
            case "reset":
                return(ResetStats(playData));

            default:
                return(new EmbedBuilder().WithAuthor(TitleBuilder(playData))
                       .WithDescription("Wrong input. \nType stats/s to show your statistics.\nType reset/r to reset the statistics.").Build());
            }
        }
Esempio n. 18
0
        public void PlayVsBot_Test_WinWithRandom()
        {
            Random      rand   = new Random();
            RpsPlayData player = CreatePlayer("r");
            RpsUserData user;
            int         plays = 0, rocks = 0, papers = 0, scissors = 0;

            rocks++;
            do
            {
                _rps.Play(player, null);
                user = (RpsUserData)_fileSystem.Load().ElementAt(0);
                plays++;
                if (user.Wins > 0)
                {
                    break;
                }
                string s;
                int    i = rand.Next(0, 3);
                switch (i)
                {
                case 0:
                    rocks++;
                    s = "r";
                    break;

                case 1:
                    papers++;
                    s = "p";
                    break;

                default:
                    scissors++;
                    s = "s";
                    break;
                }

                player = CreatePlayer(s);
            } while (user.Wins <= 0);

            Equal(user, 345678912, plays, plays, 1, user.Losses, user.Draws, user.Ratio, 1, rockChosen: rocks,
                  paperChosen: papers, scissorsChosen: scissors, coins: user.Coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 19
0
        public void PlayVsBot_Test_BestStreak()
        {
            RpsPlayData player     = CreatePlayer("p");
            const int   playsTimes = 11;

            for (int i = 0; i < playsTimes; i++)
            {
                _rps.Play(player, null, RpsActors.Rock);
            }
            _rps.Play(player, null, RpsActors.Scissors);
            int         totalPlayTimes = playsTimes + 1;
            RpsUserData user           = (RpsUserData)_fileSystem.Load().ElementAt(0);

            Equal(user, 345678912, totalPlayTimes, totalPlayTimes, playsTimes, 1, ratio: user.Ratio,
                  bestStreak: playsTimes, paperChosen: totalPlayTimes, coins: user.Coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 20
0
        public void Options_Test_ResetAndTotalPlays()
        {
            RpsPlayData player     = CreatePlayer("p");
            int         totalPlays = 3;

            for (int i = 0; i < totalPlays; i++)
            {
                _rps.Play(player, null, RpsActors.Rock);
            }
            _rps.Options(CreatePlayer("r"));
            _rps.Play(CreatePlayer("p"), null, RpsActors.Rock);
            RpsUserData user = (RpsUserData)_fileSystem.Load().ElementAt(0);

            Equal(user, 345678912, 1, totalPlays + 1, user.Wins, ratio: user.Ratio, resets: 1,
                  currentStreak: user.CurrentStreak, bestStreak: user.BestStreak, paperChosen: user.PaperChosen,
                  coins: user.Coins);

            DeleteFile(player.GuildId + ".xml");
        }
Esempio n. 21
0
        private RpsUserData CreateUser(RpsPlayData playData)
        {
            RpsUserData newData = new RpsUserData
            {
                Name      = playData.Username,
                UserId    = playData.UserId,
                GuildId   = playData.GuildId,
                ChannelId = playData.ChannelId,
                Actor     = ConvertInputIntoActor(playData.Input),
                DateVs    = DateTime.Now
            };

            _users.Add(newData);

            _fileSystem.Save(newData);

            return(newData);

            //LogToFile(LogSeverity.Info, $"Saved user: RockPaperScissors {temp.UserId} [{socketMessage.Author.Username}] {temp.GuildId} {temp.ChannelId}");
        }
Esempio n. 22
0
        private Embed ResetStats(RpsPlayData playData)
        {
            if (!Exists(playData.UserId, out RpsUserData ud))
            {
                ud = CreateUser(playData);
            }

            ud.Plays          = ud.Wins = ud.Losses = ud.Draws = ud.Ratio = ud.CurrentStreak =
                ud.BestStreak = ud.RockChosen = ud.PaperChosen = ud.ScissorsChosen = ud.Coins = 0;
            ud.Resets++;

            UpdateUsers(ud);
            _fileSystem.UpdateFile(ud);

            var embed = new EmbedBuilder()
                        .WithAuthor(TitleBuilder(playData))
                        .WithTitle($"Stats for {playData.Username} has been reset.").Build();

            return(embed);
        }
Esempio n. 23
0
        private Embed VsPlayer(RpsPlayData authorPlayData, RpsPlayData mentionPlayData)
        {
            ulong author  = authorPlayData.UserId;
            ulong mention = mentionPlayData.UserId;

            if (author == mention)
            {
                var embed = new EmbedBuilder()
                            .WithColor(Color.Red)
                            .WithDescription($"{authorPlayData.Mention} " +
                                             "If you have two hands, you can play against yourself that way.");
                return(embed.Build());
            }

            if (!Exists(author, out RpsUserData authorUd))
            {
                authorUd = CreateUser(authorPlayData);
            }
            if (!Exists(mention, out RpsUserData mentionUd))
            {
                mentionUd = CreateUser(mentionPlayData);
            }

            if (authorUd.UserIdVs != mention && mentionUd.UserIdVs == 0)
            {
                return(Challenging(ConvertInputIntoActor(authorPlayData.Input), authorUd, mentionUd, authorPlayData, mentionPlayData));
            }

            if (authorUd.UserIdVs == mention && mentionUd.Actor != RpsActors.Max)
            {
                return(Responding(ConvertInputIntoActor(authorPlayData.Input), authorUd, mentionUd, authorPlayData, mentionPlayData));
            }

            return(new EmbedBuilder()
                   .WithAuthor(TitleBuilder(authorPlayData))
                   .WithColor(Color.Red)
                   .WithTitle($"{mentionPlayData.Username} is already in battle.")
                   .Build());
        }
Esempio n. 24
0
 private EmbedAuthorBuilder TitleBuilder(RpsPlayData playData)
 {
     return(new EmbedAuthorBuilder().WithName(Title).WithIconUrl(playData.ThumbnailIconUrl));
 }
Esempio n. 25
0
        private Embed VsBot(RpsPlayData playData, RpsActors botActor)
        {
            string userMention = playData.Mention;

            Random    random      = new Random();
            int       bot         = botActor == RpsActors.Max ? random.Next(0, (int)RpsActors.Max) : (int)botActor;
            RpsActors playerActor = ConvertInputIntoActor(playData.Input);
            int       player      = (int)playerActor;
            string    competition =
                $"{userMention} threw {ConvertActorToEmoji(playerActor)}\nBot threw {ConvertActorToEmoji((RpsActors)bot)}\n\n";

            if (!Exists(playData.UserId, out RpsUserData ud))
            {
                ud = CreateUser(playData);
            }

            GameState state;
            string    processed = string.Empty;

            if ((bot + 1) % (int)RpsActors.Max == player)
            {
                state     = GameState.Win;
                processed = CoinsInKeyText;
            }
            else if ((player + 1) % (int)RpsActors.Max == bot)
            {
                state = GameState.Lose;
            }
            else
            {
                state = GameState.Draw;
            }

            ud.Actor = playerActor;
            ProcessResults(ud, state, processed, userMention, out processed);

            Color             color = new Color(0, 0, 0);
            EmbedFieldBuilder field = null;
            string            icon  = "";

            switch (state)
            {
            case GameState.Win:
                processed = processed.Replace(userMention ?? string.Empty, "");
                field     = new EmbedFieldBuilder {
                    IsInline = true, Name = "You won", Value = processed
                };
                icon = _config[Statics.RpsLoseImage];
                break;

            case GameState.Lose:
                color     = Color.Red;
                processed = processed.Replace(userMention ?? string.Empty, "");
                field     = new EmbedFieldBuilder {
                    IsInline = true, Name = "You lost", Value = processed
                };
                icon = _config[Statics.RpsWinImage];
                break;

            case GameState.Draw:
                color = Color.Gold;
                field = new EmbedFieldBuilder {
                    IsInline = true, Name = "Draw game", Value = "+0 Rings"
                };
                icon = _config[Statics.RpsDrawImage];
                break;
            }

            return(new EmbedBuilder()
                   .WithDescription(competition)
                   .WithAuthor(TitleBuilder(playData))
                   .WithTitle("ARCADE MODE")
                   .WithColor(color)
                   .WithFields(field)
                   .WithThumbnailUrl(icon)
                   .Build());
        }
Esempio n. 26
0
        private Embed Responding(RpsActors authorActor, RpsUserData authorUd, RpsUserData mentionUd, RpsPlayData authorPlayData, RpsPlayData mentionPlayData)
        {
            authorUd.Actor = authorActor;
            int    mentionActor     = (int)mentionUd.Actor;
            string authorMention    = authorPlayData.Mention;
            string mentionedMention = mentionPlayData.Mention;
            string result           =
                $"{mentionedMention} chose {ConvertActorToEmoji(mentionUd.Actor)}\n" +
                $"{authorMention} chose {ConvertActorToEmoji(authorUd.Actor)}\n\n";

            GameState mentionState, authorState;
            string    thumbnailWinner = string.Empty;

            //Responding wins
            if ((mentionActor + 1) % (int)RpsActors.Max == (int)authorActor)
            {
                result      += $"{authorMention} wins! {CoinsInKeyText}";
                authorState  = GameState.Win;
                mentionState = GameState.Lose;

                thumbnailWinner = authorPlayData.ThumbnailIconUrl;
            }
            //Instigator wins
            else if (((int)authorActor + 1) % (int)RpsActors.Max == mentionActor)
            {
                result         += $"{mentionedMention} wins! {CoinsInKeyText}";
                mentionState    = GameState.Win;
                authorState     = GameState.Lose;
                thumbnailWinner = mentionPlayData.ThumbnailIconUrl;
            }
            //Draw
            else
            {
                result      += "Draw game.";
                mentionState = authorState = GameState.Draw;
            }

            ProcessResults(mentionUd, mentionState, result, mentionedMention, out result);
            ProcessResults(authorUd, authorState, result, authorMention, out result);

            _usersActiveVs.Remove(authorUd);
            _usersActiveVs.Remove(mentionUd);

            if (_usersActiveVs.Count == 0)
            {
                _timerVs.Stop();
            }

            return(new EmbedBuilder()
                   .WithAuthor(TitleBuilder(authorPlayData))
                   .WithTitle("*GAME*")
                   .WithThumbnailUrl(thumbnailWinner)
                   .WithColor(Color.DarkOrange)
                   .WithDescription(result).Build());
        }
Esempio n. 27
0
        private Embed Challenging(RpsActors playerActor, RpsUserData authorUd, RpsUserData mentionUd, RpsPlayData authorPlayData, RpsPlayData mentionPlayData)
        {
            authorUd.UserIdVs = mentionUd.UserId;
            authorUd.Actor    = playerActor;
            authorUd.DateVs   = DateTime.Now.AddDays(1);
            int i = FindIndex(authorUd.UserId);

            _users[i] = authorUd;
            _fileSystem.UpdateFile(authorUd);

            mentionUd.UserIdVs = authorUd.UserId;
            mentionUd.Actor    = RpsActors.Max;
            mentionUd.DateVs   = authorUd.DateVs;
            i         = FindIndex(mentionUd.UserId);
            _users[i] = mentionUd;
            _fileSystem.UpdateFile(mentionUd);

            _usersActiveVs.Add(authorUd);
            _usersActiveVs.Add(mentionUd);

            if (!_timerVs.Enabled)
            {
                _timerVs.Start();
            }

            string rps =
                $"{ConvertActorToEmoji(RpsActors.Rock)}{ConvertActorToEmoji(RpsActors.Paper)}{ConvertActorToEmoji(RpsActors.Scissors)}";

            return(new EmbedBuilder()
                   .WithTitle($"{rps}*GET READY FOR THE NEXT BATTLE*{rps}")
                   .WithAuthor(TitleBuilder(authorPlayData))
                   .WithDescription($"{authorPlayData.Mention} " +
                                    "**VS** " +
                                    $"{mentionPlayData.Mention}\n\n" +
                                    $"{authorPlayData.Username} has already made a move.")
                   .WithFields(new EmbedFieldBuilder {
                IsInline = true, Name = "Ends", Value = authorUd.DateVs
            })
                   .WithColor(Color.DarkOrange).Build());
        }