Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Badge trading #231

Open
wants to merge 21 commits into
base: badge-trading
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 0 additions & 29 deletions TPP.ArgsParsing/TypeParsers/BadgeFormParser.cs

This file was deleted.

44 changes: 44 additions & 0 deletions TPP.ArgsParsing/TypeParsers/ShinyParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using System;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using TPP.Common;

namespace TPP.ArgsParsing.TypeParsers
{
/// <summary>
/// A parser that finds a badge form by name.
/// </summary>
public class ShinyParser : BaseArgumentParser<bool>
Mogiiii marked this conversation as resolved.
Show resolved Hide resolved
{
string[] shinyWords =
{
"shiny",
"shiny:true"
};
string[] plainWords =
{
"plain",
"regular",
"shiny:false"
};
public override Task<ArgsParseResult<bool>> Parse(IImmutableList<string> args, Type[] genericTypes)
{
string s = args[0];
Mogiiii marked this conversation as resolved.
Show resolved Hide resolved
ArgsParseResult<bool> result;
if (shinyWords.Contains(s))
{
result = ArgsParseResult<bool>.Success(true, args.Skip(1).ToImmutableList());
}
else if (plainWords.Contains(s))
{
result = ArgsParseResult<bool>.Success(false, args.Skip(1).ToImmutableList());
}
else
{
result = ArgsParseResult<bool>.Failure("The argument couldn't be understood as shiny or not", ErrorRelevanceConfidence.Unlikely);
}
return Task.FromResult(result);
}
}
}
4 changes: 3 additions & 1 deletion TPP.Common/PkmnForms.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,19 @@ public static class PkmnForms
["shellos"] = new Dictionary<string, int>
{
["west sea"] = 1,
["westsea"] = 1,
["west"] = 1,
["pink"] = 1,
["east sea"] = 2,
["eastsea"] = 2,
["east"] = 2,
["blue"] = 2,
},
};

public static string getFormName(PkmnSpecies pokemon, int formid)
{
string pkmnName = pokemon.Name.ToLower();
string pkmnName = pokemon.Name.ToLower(); //TODO: use normalize_name from pkmnspecies
Dictionary<string, int>? forms;
if (!Forms.TryGetValue(pkmnName, out forms))
throw new ArgumentException($"{pokemon.Name} does not have alternate forms.");
Expand Down
6 changes: 3 additions & 3 deletions TPP.Core.Tests/Commands/Definitions/BadgeCommandsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -264,9 +264,9 @@ public async Task TestGiftBadgeSuccessful()
User user = MockUser("MockUser");
User recipient = MockUser("Recipient");
_userRepoMock.Setup(repo => repo.FindBySimpleName("recipient")).Returns(Task.FromResult((User?)recipient));
Badge badge1 = new("badge1", user.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0);
Badge badge2 = new("badge2", user.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0);
Badge badge3 = new("badge3", user.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0);
Badge badge1 = new("badge1", user.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0, false);
Badge badge2 = new("badge2", user.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0, false);
Badge badge3 = new("badge3", user.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0, false);
_badgeRepoMock.Setup(repo => repo.FindByUserAndSpecies(user.Id, species))
.Returns(Task.FromResult(new List<Badge> { badge1, badge2, badge3, }));

Expand Down
8 changes: 4 additions & 4 deletions TPP.Core.Tests/Commands/Definitions/OperatorCommandsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ public async Task TestTransferBadgeSuccessful()
_messageSenderMock.Object, _badgeRepoMock.Object);
_userRepoMock.Setup(repo => repo.FindBySimpleName("gifter")).Returns(Task.FromResult((User?)gifter));
_userRepoMock.Setup(repo => repo.FindBySimpleName("recipient")).Returns(Task.FromResult((User?)recipient));
Badge badge1 = new("badge1", gifter.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0);
Badge badge2 = new("badge2", gifter.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0);
Badge badge3 = new("badge3", gifter.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0);
Badge badge1 = new("badge1", gifter.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0, false);
Badge badge2 = new("badge2", gifter.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0, false);
Badge badge3 = new("badge3", gifter.Id, species, Badge.BadgeSource.ManualCreation, Instant.MinValue, 0, false);
_badgeRepoMock.Setup(repo => repo.FindByUserAndSpecies(gifter.Id, species))
.Returns(Task.FromResult(new List<Badge> { badge1, badge2, badge3, }));

Expand Down Expand Up @@ -259,7 +259,7 @@ public async Task TestCreateBadge()
Assert.AreEqual("123 Normal #001 Species badges created for Recipient.", result.Response);
Assert.AreEqual(ResponseTarget.Source, result.ResponseTarget);
_badgeRepoMock.Verify(repo =>
repo.AddBadge(recipient.Id, species, Badge.BadgeSource.ManualCreation, 0, null),
repo.AddBadge(recipient.Id, species, Badge.BadgeSource.ManualCreation, 0, false, null),
Times.Exactly(123));
}
}
Expand Down
9 changes: 4 additions & 5 deletions TPP.Core/Commands/Definitions/OperatorCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,15 +184,14 @@ await _messageSender.SendWhisper(recipient, amount > 1

public async Task<CommandResult> CreateBadge(CommandContext context)
{
(User recipient, PkmnSpecies species, Optional<PositiveInt> amountOpt, Optional<string> formOpt, Optional<string> formOpt2) =
await context.ParseArgs<AnyOrder<User, PkmnSpecies, Optional<PositiveInt>, Optional<string>, Optional<string>>>();
(User recipient, PkmnSpecies species, Optional<PositiveInt> amountOpt, Optional<string> formOpt, Optional<bool> shinyOpt) =
await context.ParseArgs<AnyOrder<User, PkmnSpecies, Optional<PositiveInt>, Optional<string>, Optional<bool>>>();
int amount = amountOpt.Map(i => i.Number).OrElse(1);
int form = PkmnForms.pokemonHasForms(species) ? 0 : 1; // default to the first listed form if form is unspecified
Mogiiii marked this conversation as resolved.
Show resolved Hide resolved
bool shiny = shinyOpt.IsPresent ? shinyOpt.Value : false;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can be condensed to shinyOpt.OrElse(false)

if (formOpt.IsPresent)
{
string formName = formOpt.Value;
if (formOpt2.IsPresent)
formName += " " + formOpt2.Value;
try
{
form = PkmnForms.getFormId(species, formName);
Expand All @@ -206,7 +205,7 @@ public async Task<CommandResult> CreateBadge(CommandContext context)
}
}
for (int i = 0; i < amount; i++)
await _badgeRepo.AddBadge(recipient.Id, species, Badge.BadgeSource.ManualCreation, form);
await _badgeRepo.AddBadge(recipient.Id, species, Badge.BadgeSource.ManualCreation, form, shiny);

return new CommandResult
{
Expand Down
2 changes: 1 addition & 1 deletion TPP.Core/Setups.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static ArgsParser SetUpArgsParser(IUserRepo userRepo, PokedexData pokedex
argsParser.AddArgumentParser(new SignedPokeyenParser());
argsParser.AddArgumentParser(new SignedTokensParser());
argsParser.AddArgumentParser(new PkmnSpeciesParser(pokedexData.KnownSpecies, PokedexData.NormalizeName));
Mogiiii marked this conversation as resolved.
Show resolved Hide resolved
argsParser.AddArgumentParser(new BadgeFormParser());
argsParser.AddArgumentParser(new ShinyParser());
argsParser.AddArgumentParser(new BadgeSourceParser());

argsParser.AddArgumentParser(new AnyOrderParser(argsParser));
Expand Down
68 changes: 34 additions & 34 deletions TPP.Persistence.MongoDB.Tests/Repos/BadgeRepoTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task insert_then_read_are_equal()
{
BadgeRepo badgeRepo = CreateBadgeRepo();
// when
Badge badge = await badgeRepo.AddBadge(null, PkmnSpecies.OfId("16"), Badge.BadgeSource.ManualCreation, 0);
Badge badge = await badgeRepo.AddBadge(null, PkmnSpecies.OfId("16"), Badge.BadgeSource.ManualCreation, 0, false);

// then
Assert.AreNotEqual(string.Empty, badge.Id);
Expand All @@ -43,7 +43,7 @@ public async Task insert_sets_current_timestamp_as_creation_date()
IBadgeRepo badgeRepo = new BadgeRepo(
CreateTemporaryDatabase(), Mock.Of<IMongoBadgeLogRepo>(), clockMock.Object);

Badge badge = await badgeRepo.AddBadge(null, PkmnSpecies.OfId("16"), Badge.BadgeSource.ManualCreation, 0);
Badge badge = await badgeRepo.AddBadge(null, PkmnSpecies.OfId("16"), Badge.BadgeSource.ManualCreation, 0, false);
Assert.AreEqual(createdAt, badge.CreatedAt);
}

Expand All @@ -57,7 +57,7 @@ public async Task has_expected_bson_datatypes()
BadgeRepo badgeRepo = CreateBadgeRepo();
// when
PkmnSpecies randomSpecies = PkmnSpecies.OfId("9001");
Badge badge = await badgeRepo.AddBadge(null, randomSpecies, Badge.BadgeSource.RunCaught, 0);
Badge badge = await badgeRepo.AddBadge(null, randomSpecies, Badge.BadgeSource.RunCaught, 0, false);

// then
IMongoCollection<BsonDocument> badgesCollectionBson =
Expand All @@ -74,10 +74,10 @@ public async Task can_find_by_user()
{
IBadgeRepo badgeRepo = CreateBadgeRepo();
// given
Badge badgeUserA1 = await badgeRepo.AddBadge("userA", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0);
Badge badgeUserA2 = await badgeRepo.AddBadge("userA", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
Badge badgeUserB = await badgeRepo.AddBadge("userB", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
Badge badgeNobody = await badgeRepo.AddBadge(null, PkmnSpecies.OfId("4"), Badge.BadgeSource.Pinball, 0);
Badge badgeUserA1 = await badgeRepo.AddBadge("userA", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0, false);
Badge badgeUserA2 = await badgeRepo.AddBadge("userA", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);
Badge badgeUserB = await badgeRepo.AddBadge("userB", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
Badge badgeNobody = await badgeRepo.AddBadge(null, PkmnSpecies.OfId("4"), Badge.BadgeSource.Pinball, 0, false);

// when
List<Badge> resultUserA = await badgeRepo.FindByUser("userA");
Expand All @@ -95,13 +95,13 @@ public async Task can_count_by_user_and_species()
{
IBadgeRepo badgeRepo = CreateBadgeRepo();
// given
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);

// when
long countHasNone = await badgeRepo.CountByUserAndSpecies("user", PkmnSpecies.OfId("1"));
Expand All @@ -119,13 +119,13 @@ public async Task can_count_per_species_for_one_user()
{
IBadgeRepo badgeRepo = CreateBadgeRepo();
// given
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);

// when
ImmutableSortedDictionary<PkmnSpecies, int> result = await badgeRepo.CountByUserPerSpecies("user");
Expand All @@ -144,12 +144,12 @@ public async Task can_check_if_user_has_badge()
{
IBadgeRepo badgeRepo = CreateBadgeRepo();
// given
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("user", PkmnSpecies.OfId("3"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("1"), Badge.BadgeSource.Pinball, 0, false);
await badgeRepo.AddBadge("userOther", PkmnSpecies.OfId("2"), Badge.BadgeSource.Pinball, 0, false);

// when
bool hasUserSpecies1 = await badgeRepo.HasUserBadge("user", PkmnSpecies.OfId("1"));
Expand All @@ -173,7 +173,7 @@ public async Task returns_updated_badge_object()
IBadgeRepo badgeRepo = new BadgeRepo(
CreateTemporaryDatabase(), Mock.Of<IMongoBadgeLogRepo>(), Mock.Of<IClock>());
Badge badge = await badgeRepo.AddBadge(
"user", PkmnSpecies.OfId("1"), Badge.BadgeSource.ManualCreation, 0);
"user", PkmnSpecies.OfId("1"), Badge.BadgeSource.ManualCreation, 0, false);

IImmutableList<Badge> updatedBadges = await badgeRepo.TransferBadges(
ImmutableList.Create(badge), "recipient", "reason", new Dictionary<string, object?>());
Expand All @@ -192,7 +192,7 @@ public async Task unmarks_as_selling()
{
BadgeRepo badgeRepo = new(CreateTemporaryDatabase(), Mock.Of<IMongoBadgeLogRepo>(), Mock.Of<IClock>());
Badge badge = await badgeRepo.AddBadge(
"user", PkmnSpecies.OfId("1"), Badge.BadgeSource.ManualCreation, 0);
"user", PkmnSpecies.OfId("1"), Badge.BadgeSource.ManualCreation, 0, false);
await badgeRepo.Collection.UpdateOneAsync(
Builders<Badge>.Filter.Where(b => b.Id == badge.Id),
Builders<Badge>.Update
Expand All @@ -218,7 +218,7 @@ public async Task logs_to_badgelog()
Mock<IMongoBadgeLogRepo> mongoBadgeLogRepoMock = new();
BadgeRepo badgeRepo = new(CreateTemporaryDatabase(), mongoBadgeLogRepoMock.Object, clockMock.Object);
Badge badge = await badgeRepo.AddBadge(
"user", PkmnSpecies.OfId("1"), Badge.BadgeSource.ManualCreation, 0);
"user", PkmnSpecies.OfId("1"), Badge.BadgeSource.ManualCreation, 0, false);

Instant timestamp = Instant.FromUnixTimeSeconds(123);
clockMock.Setup(c => c.GetCurrentInstant()).Returns(timestamp);
Expand All @@ -237,8 +237,8 @@ public async Task triggers_species_lost_event()
Mock<IMongoBadgeLogRepo> mongoBadgeLogRepoMock = new();
BadgeRepo badgeRepo = new(CreateTemporaryDatabase(), mongoBadgeLogRepoMock.Object, Mock.Of<IClock>());
PkmnSpecies species = PkmnSpecies.OfId("1");
Badge badge1 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0);
Badge badge2 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0);
Badge badge1 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0, false);
Badge badge2 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0, false);
int userLostBadgeInvocations = 0;
badgeRepo.UserLostBadgeSpecies += (_, args) =>
{
Expand All @@ -261,8 +261,8 @@ public async Task aborts_all_transfers_if_one_fails()
Mock<IMongoBadgeLogRepo> mongoBadgeLogRepoMock = new();
BadgeRepo badgeRepo = new(CreateTemporaryDatabase(), mongoBadgeLogRepoMock.Object, Mock.Of<IClock>());
PkmnSpecies species = PkmnSpecies.OfId("1");
Badge badge1 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0);
Badge badge2 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0);
Badge badge1 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0, false);
Badge badge2 = await badgeRepo.AddBadge("user", species, Badge.BadgeSource.ManualCreation, 0, false);
// make in-memory badge reference stale to cause the transfer to fail on the second badge
await badgeRepo.Collection.UpdateOneAsync(
Builders<Badge>.Filter.Where(b => b.Id == badge2.Id),
Expand Down
Loading