Added an option to award currency based on received xp

This commit is contained in:
Kwoth
2022-08-26 13:41:30 +02:00
parent bed36f8784
commit 9eae27bc15
6 changed files with 63 additions and 39 deletions

View File

@@ -27,6 +27,9 @@ public sealed partial class XpConfig : ICloneable<XpConfig>
[Comment(@"The maximum amount of minutes the bot will keep track of a user in a voice channel")] [Comment(@"The maximum amount of minutes the bot will keep track of a user in a voice channel")]
public int VoiceMaxMinutes { get; set; } = 720; public int VoiceMaxMinutes { get; set; } = 720;
[Comment(@"The amount of currency users will receive for each point of global xp that they earn")]
public float CurrencyPerXp { get; set; } = 0;
[Comment(@"Xp Shop config")] [Comment(@"Xp Shop config")]
public ShopConfig Shop { get; set; } = new(); public ShopConfig Shop { get; set; } = new();

View File

@@ -52,11 +52,11 @@ public sealed class XpConfigService : ConfigServiceBase<XpConfig>
}); });
} }
if (data.Version < 5) if (data.Version < 6)
{ {
ModifyConfig(c => ModifyConfig(c =>
{ {
c.Version = 5; c.Version = 6;
}); });
} }
} }

View File

@@ -176,6 +176,16 @@ public class XpService : INService, IReadyExecutor, IExecNoCommand
var gxps = new List<UserXpStats>(globalToAdd.Count); var gxps = new List<UserXpStats>(globalToAdd.Count);
await using (var ctx = _db.GetDbContext()) await using (var ctx = _db.GetDbContext())
{ {
var conf = _xpConfig.Data;
if (conf.CurrencyPerXp > 0)
{
foreach (var user in globalToAdd)
{
var amount = user.Value.XpAmount * conf.CurrencyPerXp;
await _cs.AddAsync(user.Key, (long)(amount), null);
}
}
// update global user xp in batches // update global user xp in batches
// group by xp amount and update the same amounts at the same time // group by xp amount and update the same amounts at the same time
foreach (var group in globalToAdd.GroupBy(x => x.Value.XpAmount, x => x.Key)) foreach (var group in globalToAdd.GroupBy(x => x.Value.XpAmount, x => x.Key))
@@ -197,7 +207,6 @@ public class XpService : INService, IReadyExecutor, IExecNoCommand
dus.AddRange(items); dus.AddRange(items);
} }
// update guild user xp in batches // update guild user xp in batches
foreach (var (guildId, toAdd) in guildToAdd) foreach (var (guildId, toAdd) in guildToAdd)
{ {

View File

@@ -27,7 +27,7 @@ public class DefaultWallet : IWallet
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
} }
public async Task<bool> Take(long amount, TxData txData) public async Task<bool> Take(long amount, TxData? txData)
{ {
if (amount < 0) if (amount < 0)
throw new ArgumentOutOfRangeException(nameof(amount), "Amount to take must be non negative."); throw new ArgumentOutOfRangeException(nameof(amount), "Amount to take must be non negative.");
@@ -45,6 +45,8 @@ public class DefaultWallet : IWallet
if (changed == 0) if (changed == 0)
return false; return false;
if (txData is not null)
{
await ctx await ctx
.GetTable<CurrencyTransaction>() .GetTable<CurrencyTransaction>()
.InsertAsync(() => new() .InsertAsync(() => new()
@@ -57,11 +59,12 @@ public class DefaultWallet : IWallet
OtherId = txData.OtherId, OtherId = txData.OtherId,
DateAdded = DateTime.UtcNow DateAdded = DateTime.UtcNow
}); });
}
return true; return true;
} }
public async Task Add(long amount, TxData txData) public async Task Add(long amount, TxData? txData)
{ {
if (amount <= 0) if (amount <= 0)
throw new ArgumentOutOfRangeException(nameof(amount), "Amount must be greater than 0."); throw new ArgumentOutOfRangeException(nameof(amount), "Amount must be greater than 0.");
@@ -92,6 +95,8 @@ public class DefaultWallet : IWallet
await tran.CommitAsync(); await tran.CommitAsync();
} }
if (txData is not null)
{
await ctx.GetTable<CurrencyTransaction>() await ctx.GetTable<CurrencyTransaction>()
.InsertAsync(() => new() .InsertAsync(() => new()
{ {
@@ -105,3 +110,4 @@ public class DefaultWallet : IWallet
}); });
} }
} }
}

View File

@@ -5,31 +5,35 @@ public interface IWallet
public ulong UserId { get; } public ulong UserId { get; }
public Task<long> GetBalance(); public Task<long> GetBalance();
public Task<bool> Take(long amount, TxData txData); public Task<bool> Take(long amount, TxData? txData);
public Task Add(long amount, TxData txData); public Task Add(long amount, TxData? txData);
public async Task<bool> Transfer( public async Task<bool> Transfer(
long amount, long amount,
IWallet to, IWallet to,
TxData txData) TxData? txData)
{ {
if (amount <= 0) if (amount <= 0)
throw new ArgumentOutOfRangeException(nameof(amount), "Amount must be greater than 0."); throw new ArgumentOutOfRangeException(nameof(amount), "Amount must be greater than 0.");
var succ = await Take(amount, if (txData is not null)
txData with txData = txData with
{ {
OtherId = to.UserId OtherId = to.UserId
}); };
var succ = await Take(amount, txData);
if (!succ) if (!succ)
return false; return false;
await to.Add(amount, if (txData is not null)
txData with txData = txData with
{ {
OtherId = UserId OtherId = UserId
}); };
await to.Add(amount, txData);
return true; return true;
} }

View File

@@ -1,5 +1,5 @@
# DO NOT CHANGE # DO NOT CHANGE
version: 5 version: 6
# How much XP will the users receive per message # How much XP will the users receive per message
xpPerMessage: 3 xpPerMessage: 3
# How often can the users receive XP in minutes # How often can the users receive XP in minutes
@@ -10,6 +10,8 @@ xpFromImage: 0
voiceXpPerMinute: 0 voiceXpPerMinute: 0
# The maximum amount of minutes the bot will keep track of a user in a voice channel # The maximum amount of minutes the bot will keep track of a user in a voice channel
voiceMaxMinutes: 720 voiceMaxMinutes: 720
# The amount of currency users will receive for each point of global xp that they earn
currencyPerXp: 0
# Xp Shop config # Xp Shop config
shop: shop:
# Whether the xp shop is enabled # Whether the xp shop is enabled