From 6e82d6b1e69429461f0c8777fe0ba04865f43acb Mon Sep 17 00:00:00 2001 From: benbierens Date: Wed, 25 Oct 2023 10:25:00 +0200 Subject: [PATCH] Disallow duplicate eth addresses --- .../Commands/UserAssociateCommand.cs | 13 +++++-- Tools/BiblioTech/Options/EthAddressOption.cs | 4 +-- Tools/BiblioTech/UserRepo.cs | 35 +++++++++++++++++-- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/Tools/BiblioTech/Commands/UserAssociateCommand.cs b/Tools/BiblioTech/Commands/UserAssociateCommand.cs index 93411b0..e7bc7dc 100644 --- a/Tools/BiblioTech/Commands/UserAssociateCommand.cs +++ b/Tools/BiblioTech/Commands/UserAssociateCommand.cs @@ -27,8 +27,17 @@ namespace BiblioTech.Commands return; } - Program.UserRepo.AssociateUserWithAddress(userId, data); - await context.Command.FollowupAsync("Done! Thank you for joining the test net!"); + // private commands + + var result = Program.UserRepo.AssociateUserWithAddress(userId, data); + if (result) + { + await context.Command.FollowupAsync("Done! Thank you for joining the test net!"); + } + else + { + await context.Command.FollowupAsync("That didn't work."); + } } } } diff --git a/Tools/BiblioTech/Options/EthAddressOption.cs b/Tools/BiblioTech/Options/EthAddressOption.cs index 8e2173d..3105fd9 100644 --- a/Tools/BiblioTech/Options/EthAddressOption.cs +++ b/Tools/BiblioTech/Options/EthAddressOption.cs @@ -29,8 +29,8 @@ namespace BiblioTech.Options } if (!AddressUtil.Current.IsValidAddressLength(ethAddressStr) || - !AddressUtil.Current.IsValidEthereumAddressHexFormat(ethAddressStr) || - !AddressUtil.Current.IsChecksumAddress(ethAddressStr)) + !AddressUtil.Current.IsValidEthereumAddressHexFormat(ethAddressStr)) + // !AddressUtil.Current.IsChecksumAddress(ethAddressStr)) - this might make a good option later, but for now it might just annoy users. { await context.Command.FollowupAsync("EthAddress is not valid."); return null; diff --git a/Tools/BiblioTech/UserRepo.cs b/Tools/BiblioTech/UserRepo.cs index 5348f99..7418b83 100644 --- a/Tools/BiblioTech/UserRepo.cs +++ b/Tools/BiblioTech/UserRepo.cs @@ -8,11 +8,11 @@ namespace BiblioTech { private readonly object repoLock = new object(); - public void AssociateUserWithAddress(ulong discordId, EthAddress address) + public bool AssociateUserWithAddress(ulong discordId, EthAddress address) { lock (repoLock) { - SetUserAddress(discordId, address); + return SetUserAddress(discordId, address); } } @@ -79,12 +79,18 @@ namespace BiblioTech return result.ToArray(); } - private void SetUserAddress(ulong discordId, EthAddress? address) + private bool SetUserAddress(ulong discordId, EthAddress? address) { + if (IsAddressUsed(address)) + { + return false; + } + var user = GetOrCreate(discordId); user.CurrentAddress = address; user.AssociateEvents.Add(new UserAssociateAddressEvent(DateTime.UtcNow, address)); SaveUser(user); + return true; } private User GetOrCreate(ulong discordId) @@ -104,6 +110,29 @@ namespace BiblioTech return newUser; } + private bool IsAddressUsed(EthAddress? address) + { + if (address == null) return false; + + // If this becomes a performance problem, switch to in-memory cached list. + var files = Directory.GetFiles(Program.Config.UserDataPath); + foreach (var file in files) + { + try + { + var user = JsonConvert.DeserializeObject(File.ReadAllText(file))!; + if (user.CurrentAddress != null && + user.CurrentAddress.Address == address.Address) + { + return true; + } + } + catch { } + } + + return false; + } + private void SaveUser(User user) { var filename = GetFilename(user.DiscordId);