forked from EllieBotDevs/elliebot
109 lines
4.3 KiB
C#
109 lines
4.3 KiB
C#
|
#nullable disable warnings
|
||
|
using Cloneable;
|
||
|
using EllieBot.Common.Yml;
|
||
|
using EllieBot.Db.Models;
|
||
|
using EllieBot.Modules.Patronage;
|
||
|
|
||
|
namespace EllieBot.Modules.Xp;
|
||
|
|
||
|
[Cloneable]
|
||
|
public sealed partial class XpConfig : ICloneable<XpConfig>
|
||
|
{
|
||
|
[Comment("""DO NOT CHANGE""")]
|
||
|
public int Version { get; set; } = 5;
|
||
|
|
||
|
[Comment("""How much XP will the users receive per message""")]
|
||
|
public int XpPerMessage { get; set; } = 3;
|
||
|
|
||
|
[Comment("""How often can the users receive XP in minutes""")]
|
||
|
public int MessageXpCooldown { get; set; } = 5;
|
||
|
|
||
|
[Comment("""Amount of xp users gain from posting an image""")]
|
||
|
public int XpFromImage { get; set; } = 0;
|
||
|
|
||
|
[Comment("""Average amount of xp earned per minute in VC""")]
|
||
|
public double VoiceXpPerMinute { get; set; } = 0;
|
||
|
|
||
|
[Comment("""The maximum amount of minutes the bot will keep track of a user in a voice channel""")]
|
||
|
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""")]
|
||
|
public ShopConfig Shop { get; set; } = new();
|
||
|
|
||
|
public sealed class ShopConfig
|
||
|
{
|
||
|
[Comment("""
|
||
|
Whether the xp shop is enabled
|
||
|
True -> Users can access the xp shop using .xpshop command
|
||
|
False -> Users can't access the xp shop
|
||
|
""")]
|
||
|
public bool IsEnabled { get; set; } = false;
|
||
|
|
||
|
[Comment("""
|
||
|
Which patron tier do users need in order to use the .xpshop bgs command
|
||
|
Leave at 'None' if patron system is disabled or you don't want any restrictions
|
||
|
""")]
|
||
|
public PatronTier BgsTierRequirement { get; set; } = PatronTier.None;
|
||
|
|
||
|
[Comment("""
|
||
|
Which patron tier do users need in order to use the .xpshop frames command
|
||
|
Leave at 'None' if patron system is disabled or you don't want any restrictions
|
||
|
""")]
|
||
|
public PatronTier FramesTierRequirement { get; set; } = PatronTier.None;
|
||
|
|
||
|
[Comment("""
|
||
|
Frames available for sale. Keys are unique IDs.
|
||
|
Do not change keys as they are not publicly visible. Only change properties (name, price, id)
|
||
|
Removing a key which previously existed means that all previous purchases will also be unusable.
|
||
|
To remove an item from the shop, but keep previous purchases, set the price to -1
|
||
|
""")]
|
||
|
public Dictionary<string, ShopItemInfo>? Frames { get; set; } = new()
|
||
|
{
|
||
|
{"default", new() {Name = "No frame", Price = 0, Url = string.Empty}}
|
||
|
};
|
||
|
|
||
|
[Comment("""
|
||
|
Backgrounds available for sale. Keys are unique IDs.
|
||
|
Do not change keys as they are not publicly visible. Only change properties (name, price, id)
|
||
|
Removing a key which previously existed means that all previous purchases will also be unusable.
|
||
|
To remove an item from the shop, but keep previous purchases, set the price to -1
|
||
|
""")]
|
||
|
public Dictionary<string, ShopItemInfo>? Bgs { get; set; } = new()
|
||
|
{
|
||
|
{"default", new() {Name = "Default Background", Price = 0, Url = string.Empty}}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
public sealed class ShopItemInfo
|
||
|
{
|
||
|
[Comment("""Visible name of the item""")]
|
||
|
public string Name { get; set; }
|
||
|
|
||
|
[Comment("""Price of the item. Set to -1 if you no longer want to sell the item but want the users to be able to keep their old purchase""")]
|
||
|
public int Price { get; set; }
|
||
|
|
||
|
[Comment("""Direct url to the .png image which will be applied to the user's XP card""")]
|
||
|
public string Url { get; set; }
|
||
|
|
||
|
[Comment("""Optional preview url which will show instead of the real URL in the shop """)]
|
||
|
public string Preview { get; set; }
|
||
|
|
||
|
[Comment("""Optional description of the item""")]
|
||
|
public string Desc { get; set; }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static class XpShopConfigExtensions
|
||
|
{
|
||
|
public static string? GetItemUrl(this XpConfig.ShopConfig sc, XpShopItemType type, string key)
|
||
|
=> (type switch
|
||
|
{
|
||
|
XpShopItemType.Background => sc.Bgs,
|
||
|
_ => sc.Frames
|
||
|
})?.TryGetValue(key, out var item) ?? false
|
||
|
? item.Url
|
||
|
: null;
|
||
|
}
|