From 461dfd553f1c158618db31c7259118f40374f5df Mon Sep 17 00:00:00 2001 From: Master Kwoth Date: Wed, 15 Nov 2017 02:42:48 +0100 Subject: [PATCH] currency levelup rewards wip --- .../Modules/Xp/Services/XpService.cs | 44 ++++++++++++++++++ NadekoBot.Core/Modules/Xp/Xp.cs | 45 ++++++++----------- .../Services/Database/Models/XpSettings.cs | 20 +++++++++ .../Impl/GuildConfigRepository.cs | 2 + NadekoBot.Core/Services/Impl/StatsService.cs | 2 +- 5 files changed, 85 insertions(+), 28 deletions(-) diff --git a/NadekoBot.Core/Modules/Xp/Services/XpService.cs b/NadekoBot.Core/Modules/Xp/Services/XpService.cs index 65d9c818..5125ec42 100644 --- a/NadekoBot.Core/Modules/Xp/Services/XpService.cs +++ b/NadekoBot.Core/Modules/Xp/Services/XpService.cs @@ -241,6 +241,50 @@ namespace NadekoBot.Modules.Xp.Services }, token); } + public void SetCurrencyReward(ulong guildId, int level, int amount) + { + using (var uow = _db.UnitOfWork) + { + var settings = uow.GuildConfigs.XpSettingsFor(guildId); + + if (amount <= 0) + { + var toRemove = settings.CurrencyRewards.FirstOrDefault(x => x.Level == level); + if (toRemove != null) + { + uow._context.Remove(toRemove); + settings.CurrencyRewards.Remove(toRemove); + } + } + else + { + + var rew = settings.CurrencyRewards.FirstOrDefault(x => x.Level == level); + + if (rew != null) + rew.Amount = amount; + else + settings.CurrencyRewards.Add(new XpCurrencyReward() + { + Level = level, + Amount = amount, + }); + } + + uow.Complete(); + } + } + + public IEnumerable GetCurrencyRewards(ulong id) + { + using (var uow = _db.UnitOfWork) + { + return uow.GuildConfigs.XpSettingsFor(id) + .CurrencyRewards + .ToArray(); + } + } + public IEnumerable GetRoleRewards(ulong id) { using (var uow = _db.UnitOfWork) diff --git a/NadekoBot.Core/Modules/Xp/Xp.cs b/NadekoBot.Core/Modules/Xp/Xp.cs index aa4224f5..0e2a7a6e 100644 --- a/NadekoBot.Core/Modules/Xp/Xp.cs +++ b/NadekoBot.Core/Modules/Xp/Xp.cs @@ -23,34 +23,10 @@ namespace NadekoBot.Modules.Xp _client = client; _db = db; } - - //[NadekoCommand, Usage, Description, Aliases] - //[RequireContext(ContextType.Guild)] - //[OwnerOnly] - //public async Task Populate() - //{ - // var rng = new NadekoRandom(); - // using (var uow = _db.UnitOfWork) - // { - // for (var i = 0ul; i < 1000000; i++) - // { - // uow.DiscordUsers.Add(new DiscordUser() - // { - // AvatarId = i.ToString(), - // Discriminator = "1234", - // UserId = i, - // Username = i.ToString(), - // Club = null, - // }); - // var xp = uow.Xp.GetOrCreateUser(Context.Guild.Id, i); - // xp.Xp = rng.Next(100, 100000); - // } - // uow.Complete(); - // } - //} - + [NadekoCommand, Usage, Description, Aliases] [RequireContext(ContextType.Guild)] + //todo add ratelimit attribute //[Ratelimit(30)] public async Task Experience([Remainder]IUser user = null) { @@ -82,7 +58,7 @@ namespace NadekoBot.Modules.Xp .Take(9); var embed = new EmbedBuilder() - .WithTitle(GetText("role_rewards")) + .WithTitle(GetText("level_up_rewards")) .WithOkColor(); if (!roles.Any()) @@ -116,6 +92,21 @@ namespace NadekoBot.Modules.Xp await ReplyConfirmLocalized("role_reward_added", level, Format.Bold(role.ToString())).ConfigureAwait(false); } + [NadekoCommand, Usage, Description, Aliases] + [RequireContext(ContextType.Guild)] + public async Task XpCurrencyReward(int level, int amount=0) + { + if (level < 1 || amount < 0) + return; + + _service.SetCurrencyReward(Context.Guild.Id, level, amount); + + if (amount == 0) + await ReplyConfirmLocalized("cur_reward_cleared", level).ConfigureAwait(false); + else + await ReplyConfirmLocalized("cur_reward_added", level, Format.Bold(amount.ToString())).ConfigureAwait(false); + } + public enum NotifyPlace { Server = 0, diff --git a/NadekoBot.Core/Services/Database/Models/XpSettings.cs b/NadekoBot.Core/Services/Database/Models/XpSettings.cs index ca04d36b..6e5acd42 100644 --- a/NadekoBot.Core/Services/Database/Models/XpSettings.cs +++ b/NadekoBot.Core/Services/Database/Models/XpSettings.cs @@ -8,6 +8,7 @@ namespace NadekoBot.Core.Services.Database.Models public GuildConfig GuildConfig { get; set; } public HashSet RoleRewards { get; set; } = new HashSet(); + public HashSet CurrencyRewards { get; set; } = new HashSet(); public bool XpRoleRewardExclusive { get; set; } public string NotifyMessage { get; set; } = "Congratulations {0}! You have reached level {1}!"; public HashSet ExclusionList { get; set; } = new HashSet(); @@ -35,6 +36,25 @@ namespace NadekoBot.Core.Services.Database.Models } } + public class XpCurrencyReward : DbEntity + { + public int XpSettingsId { get; set; } + public XpSettings XpSettings { get; set; } + + public int Level { get; set; } + public int Amount { get; set; } + + public override int GetHashCode() + { + return Level.GetHashCode() ^ XpSettingsId.GetHashCode(); + } + + public override bool Equals(object obj) + { + return obj is XpCurrencyReward xrr && xrr.Level == Level && xrr.XpSettingsId == XpSettingsId; + } + } + public class ExcludedItem : DbEntity { public ulong ItemId { get; set; } diff --git a/NadekoBot.Core/Services/Database/Repositories/Impl/GuildConfigRepository.cs b/NadekoBot.Core/Services/Database/Repositories/Impl/GuildConfigRepository.cs index 63e8a314..59ee27b7 100644 --- a/NadekoBot.Core/Services/Database/Repositories/Impl/GuildConfigRepository.cs +++ b/NadekoBot.Core/Services/Database/Repositories/Impl/GuildConfigRepository.cs @@ -200,6 +200,8 @@ namespace NadekoBot.Core.Services.Database.Repositories.Impl set => set.Include(x => x.XpSettings) .ThenInclude(x => x.RoleRewards) .Include(x => x.XpSettings) + .ThenInclude(x => x.CurrencyRewards) + .Include(x => x.XpSettings) .ThenInclude(x => x.ExclusionList)); if (gc.XpSettings == null) diff --git a/NadekoBot.Core/Services/Impl/StatsService.cs b/NadekoBot.Core/Services/Impl/StatsService.cs index 044cda71..93269b62 100644 --- a/NadekoBot.Core/Services/Impl/StatsService.cs +++ b/NadekoBot.Core/Services/Impl/StatsService.cs @@ -21,7 +21,7 @@ namespace NadekoBot.Core.Services.Impl private readonly IBotCredentials _creds; private readonly DateTime _started; - public const string BotVersion = "2.4.4"; + public const string BotVersion = "2.5.0"; public string Author => "Kwoth#2560"; public string Library => "Discord.Net";