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"); }
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"); }
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); } }
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()); }
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"); }
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"); }
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"); }
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"); }
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"); }
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"); }
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"); }
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"); }
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"); }
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"); }
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)); }
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"); }
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()); } }
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"); }
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"); }
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"); }
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}"); }
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); }
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()); }
private EmbedAuthorBuilder TitleBuilder(RpsPlayData playData) { return(new EmbedAuthorBuilder().WithName(Title).WithIconUrl(playData.ThumbnailIconUrl)); }
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()); }
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()); }
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()); }