Files
Discord.Net/src/Discord.Net.WebSocket/Entities/AppSubscriptions/SocketEntitlement.cs
Mihail Gribkov 7723f61072 [Feature] Premium subscriptions (#2781)
* what a big commit lel, add app sub enums

* work

* ah yup lol

* `?`

* events 1

* typo

* `list` => `get` | remaining events

* add `RespondWithPremiumRequiredAsync` to interaction module base
2023-09-30 09:39:28 -04:00

92 lines
2.5 KiB
C#

using Discord.Rest;
using System;
using Model = Discord.API.Entitlement;
namespace Discord.WebSocket;
public class SocketEntitlement : SocketEntity<ulong>, IEntitlement
{
/// <inheritdoc/>
public DateTimeOffset CreatedAt { get; private set; }
/// <inheritdoc/>
public ulong SkuId { get; private set; }
/// <inheritdoc cref="IEntitlement.UserId"/>
public Cacheable<SocketUser, RestUser, IUser, ulong>? User { get; private set; }
/// <inheritdoc cref="IEntitlement.GuildId"/>
public Cacheable<SocketGuild, RestGuild, IGuild, ulong>? Guild { get; private set; }
/// <inheritdoc/>
public ulong ApplicationId { get; private set; }
/// <inheritdoc/>
public EntitlementType Type { get; private set; }
/// <inheritdoc/>
public bool IsConsumed { get; private set; }
/// <inheritdoc/>
public DateTimeOffset? StartsAt { get; private set; }
/// <inheritdoc/>
public DateTimeOffset? EndsAt { get; private set; }
internal SocketEntitlement(DiscordSocketClient discord, ulong id) : base(discord, id)
{
}
internal static SocketEntitlement Create(DiscordSocketClient discord, Model model)
{
var entity = new SocketEntitlement(discord, model.Id);
entity.Update(model);
return entity;
}
internal void Update(Model model)
{
SkuId = model.SkuId;
if (model.UserId.IsSpecified)
{
var user = Discord.GetUser(model.UserId.Value);
User = new Cacheable<SocketUser, RestUser, IUser, ulong>(user, model.UserId.Value, user is not null, async ()
=> await Discord.Rest.GetUserAsync(model.UserId.Value));
}
if (model.GuildId.IsSpecified)
{
var guild = Discord.GetGuild(model.GuildId.Value);
Guild = new Cacheable<SocketGuild, RestGuild, IGuild, ulong>(guild, model.GuildId.Value, guild is not null, async ()
=> await Discord.Rest.GetGuildAsync(model.GuildId.Value));
}
ApplicationId = model.ApplicationId;
Type = model.Type;
IsConsumed = model.IsConsumed;
StartsAt = model.StartsAt.IsSpecified
? model.StartsAt.Value
: null;
EndsAt = model.EndsAt.IsSpecified
? model.EndsAt.Value
: null;
}
internal SocketEntitlement Clone() => MemberwiseClone() as SocketEntitlement;
#region IEntitlement
/// <inheritdoc/>
ulong? IEntitlement.GuildId => Guild?.Id;
/// <inheritdoc/>
ulong? IEntitlement.UserId => User?.Id;
#endregion
}