|
|
@@ -0,0 +1,143 @@ |
|
|
|
using Discord.Rest; |
|
|
|
using System; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Model = Discord.API.Gateway.InviteCreateEvent; |
|
|
|
|
|
|
|
namespace Discord.WebSocket |
|
|
|
{ |
|
|
|
[DebuggerDisplay(@"{DebuggerDisplay,nq}")] |
|
|
|
public class SocketInvite : SocketEntity<string>, IInviteMetadata |
|
|
|
{ |
|
|
|
private long _createdAtTicks; |
|
|
|
|
|
|
|
/// <inheritdoc /> |
|
|
|
public ulong ChannelId { get; private set; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the channel where this invite was created. |
|
|
|
/// </summary> |
|
|
|
public SocketGuildChannel Channel { get; private set; } |
|
|
|
/// <inheritdoc /> |
|
|
|
public ulong? GuildId { get; private set; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the guild where this invite was created. |
|
|
|
/// </summary> |
|
|
|
public SocketGuild Guild { get; private set; } |
|
|
|
/// <inheritdoc /> |
|
|
|
ChannelType IInvite.ChannelType |
|
|
|
{ |
|
|
|
get |
|
|
|
{ |
|
|
|
switch (Channel) |
|
|
|
{ |
|
|
|
case IVoiceChannel voiceChannel: return ChannelType.Voice; |
|
|
|
case ICategoryChannel categoryChannel: return ChannelType.Category; |
|
|
|
case IDMChannel dmChannel: return ChannelType.DM; |
|
|
|
case IGroupChannel groupChannel: return ChannelType.Group; |
|
|
|
case SocketNewsChannel socketNewsChannel: return ChannelType.News; |
|
|
|
case ITextChannel textChannel: return ChannelType.Text; |
|
|
|
default: throw new InvalidOperationException("Invalid channel type."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
/// <inheritdoc /> |
|
|
|
string IInvite.ChannelName => Channel.Name; |
|
|
|
/// <inheritdoc /> |
|
|
|
string IInvite.GuildName => Guild.Name; |
|
|
|
/// <inheritdoc /> |
|
|
|
int? IInvite.PresenceCount => throw new NotImplementedException(); |
|
|
|
/// <inheritdoc /> |
|
|
|
int? IInvite.MemberCount => throw new NotImplementedException(); |
|
|
|
/// <inheritdoc /> |
|
|
|
bool IInviteMetadata.IsRevoked => throw new NotImplementedException(); |
|
|
|
/// <inheritdoc /> |
|
|
|
public bool IsTemporary { get; private set; } |
|
|
|
/// <inheritdoc /> |
|
|
|
int? IInviteMetadata.MaxAge { get => MaxAge; } |
|
|
|
/// <inheritdoc /> |
|
|
|
int? IInviteMetadata.MaxUses { get => MaxUses; } |
|
|
|
/// <inheritdoc /> |
|
|
|
int? IInviteMetadata.Uses { get => Uses; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the time (in seconds) until the invite expires. |
|
|
|
/// </summary> |
|
|
|
public int MaxAge { get; private set; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the max number of uses this invite may have. |
|
|
|
/// </summary> |
|
|
|
public int MaxUses { get; private set; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the number of times this invite has been used. |
|
|
|
/// </summary> |
|
|
|
public int Uses { get; private set; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the user that created this invite if available. |
|
|
|
/// </summary> |
|
|
|
public SocketGuildUser Inviter { get; private set; } |
|
|
|
/// <inheritdoc /> |
|
|
|
DateTimeOffset? IInviteMetadata.CreatedAt => DateTimeUtils.FromTicks(_createdAtTicks); |
|
|
|
/// <summary> |
|
|
|
/// Gets when this invite was created. |
|
|
|
/// </summary> |
|
|
|
public DateTimeOffset CreatedAt => DateTimeUtils.FromTicks(_createdAtTicks); |
|
|
|
/// <summary> |
|
|
|
/// Gets the user targeted by this invite if available. |
|
|
|
/// </summary> |
|
|
|
public SocketUser TargetUser { get; private set; } |
|
|
|
/// <summary> |
|
|
|
/// Gets the type of the user targeted by this invite. |
|
|
|
/// </summary> |
|
|
|
public TargetUserType TargetUserType { get; private set; } |
|
|
|
|
|
|
|
/// <inheritdoc /> |
|
|
|
public string Code => Id; |
|
|
|
/// <inheritdoc /> |
|
|
|
public string Url => $"{DiscordConfig.InviteUrl}{Code}"; |
|
|
|
|
|
|
|
internal SocketInvite(DiscordSocketClient discord, SocketGuild guild, SocketGuildChannel channel, SocketGuildUser inviter, SocketUser target, string id) |
|
|
|
: base(discord, id) |
|
|
|
{ |
|
|
|
Guild = guild; |
|
|
|
Channel = channel; |
|
|
|
Inviter = inviter; |
|
|
|
TargetUser = target; |
|
|
|
} |
|
|
|
internal static SocketInvite Create(DiscordSocketClient discord, SocketGuild guild, SocketGuildChannel channel, SocketGuildUser inviter, SocketUser target, Model model) |
|
|
|
{ |
|
|
|
var entity = new SocketInvite(discord, guild, channel, inviter, target, model.Code); |
|
|
|
entity.Update(model); |
|
|
|
return entity; |
|
|
|
} |
|
|
|
internal void Update(Model model) |
|
|
|
{ |
|
|
|
ChannelId = model.ChannelId; |
|
|
|
GuildId = model.GuildId.IsSpecified ? model.GuildId.Value : Guild.Id; |
|
|
|
IsTemporary = model.Temporary; |
|
|
|
MaxAge = model.MaxAge; |
|
|
|
MaxUses = model.MaxUses; |
|
|
|
Uses = model.Uses; |
|
|
|
_createdAtTicks = model.CreatedAt.UtcTicks; |
|
|
|
TargetUserType = model.TargetUserType.IsSpecified ? model.TargetUserType.Value : TargetUserType.Undefined; |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc /> |
|
|
|
public Task DeleteAsync(RequestOptions options = null) |
|
|
|
=> InviteHelper.DeleteAsync(this, Discord, options); |
|
|
|
|
|
|
|
/// <summary> |
|
|
|
/// Gets the URL of the invite. |
|
|
|
/// </summary> |
|
|
|
/// <returns> |
|
|
|
/// A string that resolves to the Url of the invite. |
|
|
|
/// </returns> |
|
|
|
public override string ToString() => Url; |
|
|
|
private string DebuggerDisplay => $"{Url} ({Guild?.Name} / {Channel.Name})"; |
|
|
|
|
|
|
|
/// <inheritdoc /> |
|
|
|
IGuild IInvite.Guild => Guild; |
|
|
|
/// <inheritdoc /> |
|
|
|
IChannel IInvite.Channel => Channel; |
|
|
|
/// <inheritdoc /> |
|
|
|
IUser IInviteMetadata.Inviter => Inviter; |
|
|
|
} |
|
|
|
} |