diff --git a/MixItUp.Base/Model/Currency/InventoryModel.cs b/MixItUp.Base/Model/Currency/InventoryModel.cs index 73a44a39a..0a133e637 100644 --- a/MixItUp.Base/Model/Currency/InventoryModel.cs +++ b/MixItUp.Base/Model/Currency/InventoryModel.cs @@ -207,6 +207,30 @@ public InventoryModel() [JsonIgnore] public string UserUniqueItemsTotalSpecialIdentifier { get { return string.Format("{0}uniqueitemstotal", this.UserAmountSpecialIdentifierHeader); } } + [JsonIgnore] + public string TopItemRegexSpecialIdentifierHeader { get { return string.Format("{0}\\d+{1}", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, this.SpecialIdentifier); } } + + [JsonIgnore] + public string TopItemSpecialIdentifierHeader { get { return string.Format("{0}{1}", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, this.SpecialIdentifier); } } + + [JsonIgnore] + public string TopTotalRegexSpecialIdentifier { get { return string.Format("{0}\\d+{1}total", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, this.SpecialIdentifier); } } + + [JsonIgnore] + public string TopTotalSpecialIdentifier { get { return string.Format("{0}{1}total", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, this.SpecialIdentifier); } } + + [JsonIgnore] + public string TopTotalUserSpecialIdentifier { get { return string.Format("{0}{1}", this.TopTotalSpecialIdentifier, SpecialIdentifierStringBuilder.UserSpecialIdentifierHeader); } } + + [JsonIgnore] + public string TopUniqueRegexSpecialIdentifier { get { return string.Format("{0}\\d+{1}unique", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, this.SpecialIdentifier); } } + + [JsonIgnore] + public string TopUniqueSpecialIdentifier { get { return string.Format("{0}{1}unique", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, this.SpecialIdentifier); } } + + [JsonIgnore] + public string TopUniqueUserSpecialIdentifier { get { return string.Format("{0}{1}", this.TopUniqueSpecialIdentifier, SpecialIdentifierStringBuilder.UserSpecialIdentifierHeader); } } + [JsonIgnore] public CommandModelBase ItemsBoughtCommand { @@ -335,6 +359,29 @@ public Dictionary GetAmounts(UserV2ViewModel user) return amounts; } + public int GetTotalAmount(UserV2Model user) + { + int total = 0; + foreach (InventoryItemModel item in this.Items.Values) + { + total += this.GetAmount(user, item); + } + return total; + } + + public int GetUniqueItemCount(UserV2Model user) + { + int count = 0; + foreach (InventoryItemModel item in this.Items.Values) + { + if (this.GetAmount(user, item) > 0) + { + count++; + } + } + return count; + } + public bool HasAmount(UserV2ViewModel user, Guid itemID, int amount) { if (this.ItemExists(itemID)) diff --git a/MixItUp.Base/Util/SpecialIdentifierStringBuilder.cs b/MixItUp.Base/Util/SpecialIdentifierStringBuilder.cs index 1f1c29027..4a81bf302 100644 --- a/MixItUp.Base/Util/SpecialIdentifierStringBuilder.cs +++ b/MixItUp.Base/Util/SpecialIdentifierStringBuilder.cs @@ -389,6 +389,129 @@ await this.ReplaceNumberBasedRegexSpecialIdentifier(currency.TopRegexSpecialIden await this.HandleUserSpecialIdentifiers(topUser, currency.TopSpecialIdentifier); } } + + foreach (InventoryModel inventory in ChannelSession.Settings.Inventory.Values) + { + if (this.ContainsRegexSpecialIdentifier(inventory.TopTotalRegexSpecialIdentifier)) + { + await this.ReplaceNumberBasedRegexSpecialIdentifier(inventory.TopTotalRegexSpecialIdentifier, async (total) => + { + IEnumerable applicableUsers = await SpecialIdentifierStringBuilder.GetAllNonExemptUsers(); + List inventoryUserList = new List(); + int userPosition = 1; + foreach (UserV2Model userData in applicableUsers.OrderByDescending(u => inventory.GetTotalAmount(u)).Take(total)) + { + UserV2ViewModel userViewModel = new UserV2ViewModel(userData); + inventoryUserList.Add($"#{userPosition}) {userViewModel.Username} - {inventory.GetTotalAmount(userData).ToNumberDisplayString()}"); + userPosition++; + } + + string result = MixItUp.Base.Resources.NoUsersFound; + if (inventoryUserList.Count > 0) + { + result = string.Join(", ", inventoryUserList); + } + return result; + }); + } + + if (this.ContainsSpecialIdentifier(inventory.TopTotalUserSpecialIdentifier)) + { + IEnumerable applicableUsers = await SpecialIdentifierStringBuilder.GetAllNonExemptUsers(); + UserV2Model topUserData = applicableUsers.Top(u => inventory.GetTotalAmount(u)); + if (topUserData != null) + { + UserV2ViewModel topUser = ServiceManager.Get().GetActiveUserByID(parameters.Platform, topUserData.ID); + if (topUser == null) + { + topUser = new UserV2ViewModel(topUserData); + } + await this.HandleUserSpecialIdentifiers(topUser, inventory.TopTotalSpecialIdentifier); + } + } + + if (this.ContainsRegexSpecialIdentifier(inventory.TopUniqueRegexSpecialIdentifier)) + { + await this.ReplaceNumberBasedRegexSpecialIdentifier(inventory.TopUniqueRegexSpecialIdentifier, async (total) => + { + IEnumerable applicableUsers = await SpecialIdentifierStringBuilder.GetAllNonExemptUsers(); + List inventoryUserList = new List(); + int userPosition = 1; + foreach (UserV2Model userData in applicableUsers.OrderByDescending(u => inventory.GetUniqueItemCount(u)).Take(total)) + { + UserV2ViewModel userViewModel = new UserV2ViewModel(userData); + inventoryUserList.Add($"#{userPosition}) {userViewModel.Username} - {inventory.GetUniqueItemCount(userData).ToNumberDisplayString()}"); + userPosition++; + } + + string result = MixItUp.Base.Resources.NoUsersFound; + if (inventoryUserList.Count > 0) + { + result = string.Join(", ", inventoryUserList); + } + return result; + }); + } + + if (this.ContainsSpecialIdentifier(inventory.TopUniqueUserSpecialIdentifier)) + { + IEnumerable applicableUsers = await SpecialIdentifierStringBuilder.GetAllNonExemptUsers(); + UserV2Model topUserData = applicableUsers.Top(u => inventory.GetUniqueItemCount(u)); + if (topUserData != null) + { + UserV2ViewModel topUser = ServiceManager.Get().GetActiveUserByID(parameters.Platform, topUserData.ID); + if (topUser == null) + { + topUser = new UserV2ViewModel(topUserData); + } + await this.HandleUserSpecialIdentifiers(topUser, inventory.TopUniqueSpecialIdentifier); + } + } + + foreach (InventoryItemModel item in inventory.Items.Values) + { + string itemTopRegex = string.Format("{0}\\d+{1}{2}", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, inventory.SpecialIdentifier, item.SpecialIdentifier); + if (this.ContainsRegexSpecialIdentifier(itemTopRegex)) + { + await this.ReplaceNumberBasedRegexSpecialIdentifier(itemTopRegex, async (total) => + { + IEnumerable applicableUsers = await SpecialIdentifierStringBuilder.GetAllNonExemptUsers(); + List itemUserList = new List(); + int userPosition = 1; + foreach (UserV2Model userData in applicableUsers.OrderByDescending(u => inventory.GetAmount(u, item)).Take(total)) + { + UserV2ViewModel userViewModel = new UserV2ViewModel(userData); + itemUserList.Add($"#{userPosition}) {userViewModel.Username} - {inventory.GetAmount(userData, item).ToNumberDisplayString()}"); + userPosition++; + } + + string result = MixItUp.Base.Resources.NoUsersFound; + if (itemUserList.Count > 0) + { + result = string.Join(", ", itemUserList); + } + return result; + }); + } + + string itemTopUser = string.Format("{0}{1}{2}{3}", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, inventory.SpecialIdentifier, item.SpecialIdentifier, SpecialIdentifierStringBuilder.UserSpecialIdentifierHeader); + if (this.ContainsSpecialIdentifier(itemTopUser)) + { + IEnumerable applicableUsers = await SpecialIdentifierStringBuilder.GetAllNonExemptUsers(); + UserV2Model topUserData = applicableUsers.Top(u => inventory.GetAmount(u, item)); + if (topUserData != null) + { + UserV2ViewModel topUser = ServiceManager.Get().GetActiveUserByID(parameters.Platform, topUserData.ID); + if (topUser == null) + { + topUser = new UserV2ViewModel(topUserData); + } + string itemTopPrefix = string.Format("{0}{1}{2}", SpecialIdentifierStringBuilder.TopSpecialIdentifierHeader, inventory.SpecialIdentifier, item.SpecialIdentifier); + await this.HandleUserSpecialIdentifiers(topUser, itemTopPrefix); + } + } + } + } } foreach (CurrencyModel currency in ChannelSession.Settings.Currency.Values)